我在同樣的問題來在我的MVC 3應用程序。我有一種觀點來創建一個新產品,並且該產品可以被分配到一個或多個類別。這裏是我的EF的Code First模型類:我如何ModelBind與MVC 3和實體框架代碼第一次一個多一對多的關係?
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中是無效的,並將它與下面的驗證錯誤返回編輯觀點:
The value '25,2' is invalid. // 25 and 2 being the CategoryIDs
這對我來說很有意義,它可以」將25和2綁定到實際的類別對象中,但是有沒有一種標準的方式來使用自定義的ModelBinder,這將允許我將ID轉換爲類別並將它們附加到上下文中?
啊,在你檢查模型有效性之前,首先添加類別的好主意! – Slauma
我正在嘗試做同樣的事情。儘管存根創建給我一個錯誤。 'id'不是一個SelectListItem嗎?發佈問題後,您似乎已經更改了ViewModel。 –
@Omkar這是正確的,我的ViewModel現在已將SelectedCategories定義爲列表 –
Austin