ASP.NET MVC5 Razor ListBox в форме с MultiSelectList

Я пытаюсь создать ListBox, в котором можно выбрать несколько тегов для цитаты, которая создается в форме. Все отображается нормально, все параметры, которые должны быть показаны, отображаются в ListBox, но даже несмотря на то, что я выбрал некоторые из них, соответствующая Коллекция в возвращенной ViewModel пуста или равна нулю.

Я упростил модель ради своего вопроса, и в основном в ней есть только кавычки с отношением «многие ко многим» к тегам. Итак, когда я хочу создать новую цитату, я должен дать ей содержание и набор тегов.

Итак, у меня есть такая модель:

public class Quote
    {
        public int Id { get; private set; }

        [Required]
        public string Content { get; set; }

        public ICollection<Tag> Tags { get; private set; }
    }

и

public class Tag
    {  
        public int Id { get; set; }

        [Required]
        public string Designation { get; set; }

        public ICollection<Quote> Quotes { get; private set; }
    }

ViewModel:

public class QuoteCreateViewModel
{
    public IEnumerable<Tag> Tags { get; set; }

    public Quote Quote { get; set; }

    public QuoteCreateViewModel(Quote quote, IList<Tag> tags)
    {
        Quote = quote;
        Tags = tags;
    }
}

КотировкиКонтроллер:

public ActionResult Create()
    {
        QuoteCreateViewModel viewModel =
            new QuoteCreateViewModel(new Quote(), _context.Tags.ToList());

        return View(viewModel);
    }

    [HttpPost]
    public ActionResult Create(QuoteCreateViewModel quoteCreateViewModel)
    {
        Quote quote = quoteCreateViewModel.Quote;

        _context.Quotes.Add(quote);
        _context.SaveChanges();

        return RedirectToAction("Index");

И соответствующий вид:

@model CiteMe.ViewModels.QuoteCreateViewModel

@using (Html.BeginForm("Create", "Quotes"))
{
    <div class="form-group">
        @Html.LabelFor(m => m.Quote.Content)
        @Html.TextBoxFor(m => m.Quote.Content, new { @class = "form-control"})
    </div>

    <div class="form-group">
        @Html.LabelFor(m => m.Quote.Tags)
        @Html.ListBoxFor(m => m.Quote.Tags, new MultiSelectList(Model.Tags, "Id", "Designation"), new { @class = "form-control", multiple = "multiple" })
    </div>

    <button type="submit" class="btn btn-primary">Save</button>
}

Насколько я понимаю, @Html.ListBoxFor(m => m.Quote.Tags, new MultiSelectList(Model.Tags, "Id", "Designation"), new { @class = "form-control", multiple = "multiple" }) должен помочь мне. Я также попробовал подход, который нашел здесь, но он дает те же результаты. Пустые коллекции, даже если что-то было выбрано или пусто вместо экземпляра коллекции.


person be_cracked    schedule 30.08.2017    source источник


Ответы (1)


Я обнаружил свою ошибку в реализации этого решения.

Тип коллекции должен быть типом свойства id, что я испортил.

В ViewModel у меня было свойство типа List<Tag> вместо List<typeOf(Tag.Id)>.

person be_cracked    schedule 09.09.2017