MVC 3 응용 프로그램에서 같은 문제가 발생합니다. 새로운 제품을 만들 수있는 견해가 있으며 그 제품을 하나 이상의 카테고리에 할당 할 수 있습니다. 여기 내 EF 코드 첫 번째 모델 클래스는 다음과 같습니다어떻게 ModelBind MVC 3과 Entity Framework 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이 잘못하고 다음과 같은 유효성 검사 오류로 편집보기를 반환
The value '25,2' is invalid. // 25 and 2 being the CategoryIDs
그것은 그다지는 '할 수있는 의미가 있습니다 25와 2를 실제 범주 객체에 바인딩하지만 ID를 범주로 변환하고 컨텍스트에 첨부 할 수있는 사용자 정의 ModelBinder를 사용하는 표준 방법이 있습니까?
아, 모델 유효성을 확인하기 전에 먼저 카테고리를 추가하는 것이 좋습니다. – Slauma
나는 똑같은 일을하려하고있다. 스텁 생성으로 인해 오류가 발생합니다. 'id'가 SelectListItem이 아닌가? 질문을 게시 한 후 ViewModel을 변경 한 것 같습니다. –
@Omkar 맞습니다. 이제 내 ViewModel에는 List로 정의 된 SelectedCategories가 있습니다. –
Austin