带有MultiSelectList的ASP.NET MVC5 Razor ListBox

时间:2017-08-30 14:23:02

标签: c# asp.net razor listbox

我正在尝试使用ListBox,其中可以为表单中创建的引用选择多个标记。一切都很好,应该显示的所有选项都显示在ListBox中,但即使我选择了一些,返回的ViewModel中的相应Collection也为空或为null。

为了我的问题,我简化了模型,它基本上只有与标签有多对多关系的行情。所以,当我想创建一个新的引用时,我必须给它内容和标签集合。

所以我有一个这样的模型:

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; }
    }

视图模型:

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;
    }
}

QuotesController:

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" })应该为我做的伎俩。我也尝试了一种我发现here的方法,但它提供了相同的结果。即使选择了某些内容,也为空集合,或者为null而不是集合的实例。

1 个答案:

答案 0 :(得分:-1)

我在执行此Solution时发现了我的错误。

Collection的类型必须是id属性的类型,我搞砸了。

在ViewModel中,我有一个List<Tag>类型的属性,而不是List<typeOf(Tag.Id)>