我正在尝试使用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而不是集合的实例。
答案 0 :(得分:-1)
我在执行此Solution时发现了我的错误。
Collection的类型必须是id属性的类型,我搞砸了。
在ViewModel中,我有一个List<Tag>
类型的属性,而不是List<typeOf(Tag.Id)>
。