2013-04-28 4 views
0

데이터베이스에서 검색 한 항목 목록에서 선택하는 방법을 찾고 있습니다. 이러한 항목을 뷰에 보내고 목록에서 선택하고이를 컨트롤러로 반환하여 데이터베이스 내에 보조 테이블을 채우고 싶습니다. 보기에 항목을 전달하고 표시하도록 할 수 있지만 이러한 항목을 다시 컨트롤러로 전달할 수는 없습니다.MVC4보기의 항목 목록에서 선택

컨트롤러 (업데이트 다시) 호출 :

public ActionResult Create() 
    { 
     var myMeal = new CreateMeal(); 
     List<ProductsToInclude> pti = new List<ProductsToInclude>(); 
     myMeal.ProductsToInclude = pti; 
     IList<Product> prods = db.Products.ToList(); 


     foreach(var prod in prods) 
     { 
      pti.Add(new ProductsToInclude { Product = prod }); 
     } 

     return View(myMeal); 
    } 

    // 
    // POST: /Meal/Create 

    [HttpPost] 
    [ValidateAntiForgeryToken] 
    public ActionResult Create(CreateMeal myMeal) 
    { 
     if (ModelState.IsValid) 
     { 
      /* Add code to handle my meal and create a meal for data base*/ 
      db.Meals.Add(meal); 
      db.SaveChanges(); 
      return RedirectToAction("Index"); 
     } 

     return View(pti); 
    } 

ProductsToInclude 뷰 모델을

public class ProductsToInclude 
{ 
    public Product Product { get; set; } 
    public Boolean Include { get; set; } 
} 

새로운 CreateMeal 뷰 모델 :

public class CreateMeal 
{ 
    public String Name { get; set; } 
    public IList<ProductsToInclude> ProductsToInclude { get; set; } 
} 

만들기를보기 :

(210)

그리고 (업데이트) 편집기 templete입니다 :

@model MealPlanner.ViewModels.ProductsToInclude 

<tr> 
    <td> 
     @Html.CheckBoxFor(m => m.Include) 
    </td> 
    <td> 
     @Model.Product.Name 
     @Model.Product.Quantity 
     @Model.Product.unit.UnitName 
     @Html.HiddenFor(m => m.Product.Name) 
     @Html.HiddenFor(m => m.Product.Quantity) 
     @Html.HiddenFor(m => m.Product.unit.UnitName) 
    </td> 
</tr> 

식사 모델 :

public class Meal 
{ 
    public int MealId { get; set; } 
    public String Name { get; set; } 
    //public virtual IList<Product> Products { get; set; } 
    public int UserId { get; set; } 
} 

UPDATE :

내가이 표시 얻을 수 EditorTemplete까지 전환. 이제 myMeal.ProductsToInclude.Add (new ProductsToInclude {Product = prod, Include = false}) 오류가 발생합니다. Create 메서드에서. 찌르다는 인구가 8 제품에있다.

+0

가장 큰 문제 일 가능성이있는 오류가 있지만 전체 답변을 제공하려면 식사 클래스 코드로 질문을 업데이트 할 수 있습니까? – macsux

+0

게시물의 요청 양식 데이터를 확인 했습니까?네가 필요로하는 것을 네가 기대하는 것과 다르게 명명 했어? – PeteGO

+0

@PeteGO 반환 양식 데이터가 null입니다. – jbolt

답변

0

두 가지 기본적인 문제가 있습니다. (그리고 세 번째로는 어떤 모델도보기에 전달하지 않지만보기에는 Meal 객체가 있어야합니다.) 먼저, 사용자가 렌더링하는 모델과 다른 모델을 게시하고 있습니다. 따라서 양식을 게시 할 때 게시 작업에서 ProductsToInclude 목록을 기대하기 때문에 Meal.Name 개체를 인식하지 못합니다.

Meal.Name의 값을 변경하지 않으려면 EditorFor가 아닌 DisplayFor로 렌더링하는 것이 좋습니다.

둘째, 양식 필드를 렌더링하는 방식은 기본 모델 바인더가 컬렉션에 바인딩 할 수 있도록 올바른 명명 구조를 만들지 않습니다. 내가 선호하는 방법 인 EditorTemplates를 사용할 수 있습니다.

Partial을 사용하는 대신 ProductsToInclude.cshtml이라는 편집기 템플릿을 만들고 모델 유형을 ProductsToInclude (List없이)로 설정 한 다음 단일 항목 인 것처럼 렌더링합니다. 테이블과 헤더 정보를 메인보기로 옮기고 싶을 것입니다.

EditorTemplates는 특별한 조치없이이 상황을 처리합니다. 자동으로 컬렉션을 반복하고 이름을 올바르게 렌더링합니다. 당신이 할 수있는 곳에 그것을 사용하십시오.

<div> 
    <table> 
     <tr> 
      <th> 
       @Html.DisplayName("Include") 
      </th> 
      <th> 
       @Html.DisplayName("Available Products") 
      </th> 
      <th></th> 
     </tr> 
     @Html.EditorFor(m => m.ProductsToInclude) 
    </table> 
</div> 

귀하의 ProductsToInclude.cshtml가에서 EditorTemplates라는 폴더에 살아야 하나 ~/조회/공유 또는 로컬보기 폴더입니다.

@model ProductsToInclude 
<tr> 
    <td> 
     @Html.CheckBoxFor(m => m.Include) 
    </td> 
    <td> 
     @Html.DisplayFor(m => m.Product.Name) 
     @Html.DisplayFor(m => m.Product.Quantity) 
     @Html.DisplayFor(m => m.Product.unit.UnitName) 
    </td> 
    <td> 
     @Html.ActionLink("Edit", "Edit", new { id=Model.PrimaryKey }) | 
     @Html.ActionLink("Details", "Details", new { id=Model.PrimaryKey }) | 
     @Html.ActionLink("Delete", "Delete", new { id=Model.PrimaryKey }) 
    </td> 
</tr> 
+0

예제에서 @Html.EditorFor (m => m.ProductsToInclude) : 어떤 모델을 Create Method로 보내겠습니까? 그 목록이 ProductsToInclude (pti?)일까요? MealName은 사용자가 작성중인 식사의 이름을 지정하기위한 것입니다. 본질적으로 이전에 만들어진 제품을 기반으로 한 식사를 만들 수 있어야합니다. 어떻게 내가 거기에 도착하는지는 저의 걸림돌입니다. – jbolt

+0

@ jbolt - 당신은 그것을 알아 내야 할 것입니다. ViewBag에 ProductsTo를 포함하지 말고, View 모델의 일부로 포함시켜야합니다.이 모델에는 Name 속성도 있어야합니다. 뷰 모델에는 뷰에 필요한 모든 정보가 포함되어야합니다. 뷰 모델을 컨트롤러 액션에서 반환하는'View()'메소드의 매개 변수로 뷰에 전달합니다. –

+0

업데이트 된 코드베이스 (업데이트 참조). 이 예제는 [Editor Templetes] (http://stackoverflow.com/questions/12073088/return-listt-from-view-to-controller-in-mvc-3)에서 가져 왔습니다. – jbolt

관련 문제