我在 MVC 3 应用程序中遇到了同样的问题。我有一个创建新产品的视图,并且该产品可以分配给一个或多个类别。这是我的 EF Code First 模型类:
public class Product
{
public int ProductID { get; set; }
public string Name { get; set; }
public virtual ICollection<Category> Categories { get; set; }
}
public class Category
{
public int CategoryID { get; set; }
public string Name { get; set; }
public virtual ICollection<Product> Products { get; set; }
}
因此,我为创建产品视图创建一个视图模型,并包含产品和类别列表:
public class ProductEditViewModel
{
public Product Product { get; set; }
public List<SelectListItem> CategorySelections { get; set; }
public ProductEditViewModel(Product product, List<Category> categories)
{
this.Product = product;
CategorySelections = categories.Select(c => new SelectListItem()
{
Text = c.Name,
Value = c.CategoryID.ToString(),
Selected = (product != null ? product.Categories.Contains(c) : false)
}).ToList();
}
}
因此,我渲染一个视图,其中包含名称输入和每个类别的复选框列表(名为“Product.Categories”)。当我的表单被发回时,我想保存产品及其关联的类别(或者如果 ModelState 无效,则重新显示用户完整选择的类别的视图)。
[HttpPost]
public ActionResult Create(Product product)
{
if (ModelState.IsValid)
{
db.Products.Add(product);
db.SaveChanges();
return RedirectToAction("Index");
}
return View(new ProductEditViewModel(product, db.Categories.ToList()));
}
当我这样做并选择一个或多个类别时,ModelState 无效,它返回编辑视图,并显示以下验证错误:
值“25,2”无效。 // 25 和 2 是 CategoryID
对我来说,它不能将 25 和 2 绑定到实际的类别对象中,这是有道理的,但是是否有一种标准方法来使用自定义 ModelBinder,允许我将 ID 转换为类别并将它们附加到上下文?