2013-12-08 2 views
1

레시피 목록이 있고 각 레서피에 여러 개의 레서피 선이 있습니다. 각 레시피를 반복하고 싶습니다. 레서피 선 foreach Recipe foreach.ViewModel을 사용하여 부분적으로 자식 foreach가 루핑되지 않음

레시피 클래스

namespace XXX.Models 
    { 
     public class Recipe 
     { 
      public int RecipeID { get; set; } 
      public string RecipeName { get; set; } 
      public string RecipeInstructions { get; set; } 

      public virtual List<RecipeLine> RecipeLines { get; set; } 
     } 
    } 

RecipeLine 클래스

namespace XXX.Models 
    { 
     public class RecipeLine 
     { 
      public int RecipeLineID { get; set; } 
      public float Quantity { get; set; } 

      public int MeasurementID { get; set; } 
      public int RecipeID { get; set; } 
      public int IngredientID { get; set; } 

      public virtual Measurement Measurement { get; set; } 
      public virtual Recipe Recipe { get; set; } 
      public virtual Ingredient Ingredient { get; set; } 

     } 
    } 

성분 및 측정 클래스를 나열 할 필요가 없습니다, 그러나 구조화 정상입니다. 이제

의이 뷰 모델

namespace XXX.ViewModels 
    { 
     public class RecipeLineViewModel 
     { 
      public IEnumerable<Recipe> Recipes { get; set; } 
      public IEnumerable<RecipeLine> RecipeLines { get; set; } 
     } 
    } 

그리고 PartialsController 살펴 보자

namespace XXX.Controllers 
    { 

     public class PartialsController : Controller 
     { 
      private XXXDb db = new XXXDb(); 

      public ActionResult RecipeList() 
      { 
       RecipeLineViewModel viewModel; 

       viewModel = new RecipeLineViewModel(); 
       viewModel.Recipes = db.Recipes.ToList(); 
       viewModel.RecipeLines = db.RecipeLines.Include(r => 
       r.Measurement).Include(r => r.Ingredient); 

       return PartialView("_RecipeList", viewModel); 
      } 
     } 
    } 

이제 부분 뷰는 뷰> 파셜> __RecipeList.cshtml

RecipeList 부분보기

@model XXX.ViewModels.RecipeLineViewModel 

    @foreach (Recipe recipe in Model.Recipes) 
     { 
     <div>@recipe.RecipeName</div> 
     <div>@recipe.RecipeInstructions</div> 

      foreach (RecipeLine recipeLines in Model.RecipeLines) 
      { 
       <div class="row"> 
        <div class="large-12 columns"> 
         @recipeLines.Quantity @recipeLines.Measurement.MeasurementEn 
         @recipeLines.Ingredient.IngredientNameEn 
        </div> 
       </div> 
      } 

     } 
    } 
입니다

(각 recipeLine 끝에 RecipeID를 인쇄하여 각 recipe가 RecipeID = 1에 대한 Recipe Lines를 반복하고 자신의 RecipeID와 관련된 라인을 반복하지 않음을 보여줍니다. 나는이 물건에 초보자이다, 나는 그들이 어딘가에 내가 레서피 라인에 레서피에 대해 그들이 루핑해야한다고 말하고 있어야한다고 생각하고있다. Linq에 절은 foreach는 어디에

Parent/Child Loop Result:

+0

레서피 클래스에 RecipeLines 컬렉션이있는 경우 왜 ViewModel에 레시피 클래스 컬렉션이 있습니까? 내부 루프가'recipe.RecipeLines'을 인쇄해야합니다 ... –

+0

오류로 수정하려고합니다. –

답변

1

이 추가 : 여기

내가지고있어 결과입니다.

@foreach (Recipe recipe in Model.Recipes) 
      { 
      <div>@recipe.RecipeName</div> 
      <div>@recipe.RecipeInstructions</div> 

       foreach (RecipeLine recipeLines in Model.RecipeLines.Where(rl => rl.RecipeID == recipe.RecipeID)) 
       { 

UPD :
는 는 또한 당신은 definently 조리법에 RecipeLine 물건을 포함 할 수 있으며 모든 RecipeLine 컬렉션이 필요하지 않습니다!

뭔가 이런 recipe.RecipeLines을 통해 그냥 루프 : 당신의 Recipie 모델에서

viewModel.Recipes = db.Recipes.Include("RecipeLine").Include("RecipeLine.Measurement"). 
       .Include("RecipeLine.Ingredient"); 
+0

당신의 코드 샘플을 고맙게 생각합니다. 이것은 정확하게하려고 한 것이지만 구문은 꺼져 있습니다. 시간 내 줘서 고마워! 작업 한 코드 샘플 (잘라 내기 및 붙여 넣기) 때문에 올바른 답을 표시했습니다. –

+0

나는 1 점 만났으므로 25 점을 얻었습니다. 이제 50 점을 넘기 때문에 사람들의 대답에 대해 의견을 말할 수 있습니다! 40 점 이상이기 때문에 이미지를 업로드 할 수 있다고 생각합니다. 좋은 직업, 대답 주셔서 감사합니다! –

+0

대체 주셔서 감사합니다. 이 예제에 최적화가 있습니까? 서버/데이터베이스에 대한 작업이 줄어 듭니까? 내가 Partials와 View Models을 배우고 있기 때문에 읽고 쓰는 것이 쉽다는 단점이 있지만, 단축키를 배우는 것은 라운드와 관련하여 적은 코드와 효율성을 필요로한다. –

2

하나 가정 것 List<RecipieLine> 속성이있는 하나 개 이상의 RecipieLine 모델 객체를 유지하는 것입니다. RecipieLineViewModel에는 RecipieRecipieLine 개체가 노출되는 두 개의 개별 IEnumerable 컬렉션이 있습니다. 실제보기에서

, 당신은 당신의 Recipie 컬렉션을 반복된다 : 이것은 RecipieLine 모델 객체를 통해 열거

foreach (RecipeLine recipeLines in Model.RecipeLines) 

:

@foreach (Recipe recipe in Model.Recipes) 

좋아 보인다, 그러나, 다음 줄은 당신의 문제입니다 그러나 귀하의 RecipieLineViewModelRecipieLine 컬렉션에 저장되어 있지만 현재 귀하의 바깥쪽에 Recipie이 (가) 열거되고 있음을 알 수있는 방법이 없습니다 foreach.

당신이 중 하나는 현재 Recipie 객체 열거에서 사용 가능한 데이터를 사용하여 어떤 종류의 where LINQ 절을 제공하거나 Model보다는 현재 Recipie 열거를 사용하는 내부 foreach을 변경하려는. 위의 그것으로 나의 선호하는 방법이 될 것입니다

@forech (var recipie in Model.Recipies) 
{ 
    <div>@recipe.RecipeName</div> 
    <div>@recipe.RecipeInstructions</div> 
    foreach (var recipieLine in recipie.RecipieLines) 
    { 
     <div class="row"> 
      <div class="large-12 columns"> 
       // Do something with recipieLine here 
      </div> 
     </div> 
    } 
} 

:

업데이트 완성도를 들어

, 여기에 관련 RecipieLine들에 액세스하기 위해 현재 Recipe 객체 열거를 사용하는 방법의 예입니다 각 열거 형에서 LINQ 쿼리를 수행하는 것이 더 효율적이며 실질적으로 중복 코드 인 ViewModel에서 IEnumerable<RecipieLine>을 제거합니다.

+0

답변을 주셔서 감사합니다. 올바른 코드 샘플을 제공했기 때문에 위의 대답을 정답으로 선택했습니다. 그러나 올바른 답을 이끌어 낼 수있는 설명이 있었기 때문에 답을 1 점 더 주었고, 내가 살펴볼 대안을 제시했습니다. 답장을 보내 주셔서 감사합니다! –

+1

@ EricB - 당신이 대답 해 주니 기쁘다. 우선 순위 다. 현재의'Recipie' 열거를 사용하는 또 다른 해결책은'ViewModel'에서 복사 된'IEnumerable '콜렉션을 제거 할 수있게하는 것입니다. 내가 선호하는 방법이 될 것이다. –

+0

두 번째 foreach : foreach (recipe.RecipeLines의 RecipeLine recipeLine) – aershov