【发布时间】:2011-08-31 15:54:27
【问题描述】:
我在我的 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 是 CategoryIDs
它不能将 25 和 2 绑定到实际的类别对象中,这对我来说是有意义的,但是是否有一种标准方法可以使用自定义 ModelBinder 允许我将 ID 转换为类别并将它们附加到上下文中?
【问题讨论】:
标签: entity-framework asp.net-mvc-3 viewmodel model-binding