2013-06-26 3 views
1

스카 폴딩 옵션을 사용하여 SubscriptionController을 만들었습니다. 내가 Model이 sugeests 같은 LIST Subscription보다는 하나 개 Subscription 정체성에 바인딩 생각ASP.NET MVC4의 모델 및 항목 모델 바인딩

  1. : 여기

    In Controller: 
    
    public ActionResult Index() 
    { 
        var subscriptions = db.Subscriptions; 
        return View(subscriptions.ToList()); 
    } 
    
    In View: 
    
    @model IEnumerable<Liquidity.Domain.Entity.Subscription> 
    
    @{ 
        ViewBag.Title = "Index"; 
    } 
    
    <h2>Index</h2> 
    
    <p> 
        @Html.ActionLink("Create New", "Create") 
    </p> 
    <table> 
        <tr> 
         <th> 
          @Html.DisplayNameFor(model => model.Amount) 
         </th> 
        </tr> 
    
    @foreach (var item in Model) { 
        <tr> 
         <td> 
          @Html.DisplayFor(modelItem => item.Amount) 
         </td>  
         </td> 
        </tr> 
    } 
    </table> 
    
    For my subscription model, I have: 
    
    public decimal Amount { get; set; } 
    

    내 질문 있습니다 : 여기
    몇 가지 코드 조각입니다

    @foreach (모델의 var item)

    이 정확합니까? (1)가 올

  2. , 왜이 줄 :

    @Html.DisplayNameFor(model => model.Amount)

    모델은 Amount있을 것입니다? 이는 모델이 단일 "구독"에 묶여 있음을 나타냅니다.

    @Html.DisplayFor(modelItem => item.Amount) 에 modelItem 및 항목 무엇 바인딩 :이 라인에 대한

  3. ? lambda가 modelItem을 허용하지만 사용하지 않는 이유는 무엇입니까?

모델, 모델 및 모델 항목이 정확히 무엇인지 설명하십시오.
감사합니다.

답변

2
  1. 맞습니다.
  2. this 과부하 DisplayNameFor을 사용 중입니다. 이렇게하면 열 머리글과 같은 항목을 표시하기 위해 IEnumerable 모델에서 단일 항목을 가져올 수 있습니다.
  3. modelItem은 (는) 모델입니다. item은 foreach에서 가져온 것입니다. 이것은 다소도우미를 사용할 수 있도록 속이는 것입니다.

항목 3에 대한 추가 정보. DisplayFor에 적합합니다. 그러나 편집 가능한 눈금을 만들려면이 문제가 발생할 것이며 EditorFor/TextboxFor입니다. Razor는 전달 된 표현식을 기반으로 생성 된 HTML에 이름을 할당합니다.이 때문에 테이블의 모든 항목은 같은 이름을 갖게됩니다. 그러나 컬렉션을 게시하려면 이름에 Item[0].Amount, Item[1].Amount 등의 색인이 포함되어야합니다 ....

이 작업을 수행하는 데는 두 가지 옵션이 있습니다.

먼저 foreach 대신 for을 사용하십시오. 인덱서, IList, ICollection 등을 지원하는 모델로 모델을 변경해야합니다.

@for(int i = 0; i < Model.Count; i++) 
{ 
    <tr> 
     <td> 
      @Html.EditorFor(model=> model[i].Amount) 
     </td>  
     </td> 
    </tr> 
} 

또는 편집기 템플릿을 만드는 것이 좋습니다. 보기 이름에 "EditorTemplates"라는 새 폴더를 만듭니다. 그런 다음 "Subscription.cshtml"이라는 파일을 만듭니다.이 파일은 이제보기에, 당신은 당신의 모델 모음입니다

@Html.EditorFor(model => modle) 

또는

@Html.EditorForModel() 

면도기 엔진이 recornize 똑똑를 가질 수이

@model Subscription 
<tr> 
    <td> 
     @Html.EditorFor(model=> model.Amount) 
    </td>  
    </td> 
</tr> 

과 같아야합니다 컬렉션의 각 항목에 대해 EditorTemplate을 렌더링합니다. 또한 이름을 올바르게 생성하므로 걱정할 필요가 없습니다. 이 방법을 사용하면 IEnumerable 모델을 계속 사용할 수 있습니다.

DisplayTemplates에서도 작동합니다. DisplayTemplates 폴더의 이름을 변경하고 EditorFor 대신 DisplayFor을 사용해야합니다.

+0

+1 '생성 된 이름'을 말합니다. – Win

+0

자세한 설명 주셔서 감사합니다. 템플릿을 만드는 데 귀하의 조언을 따르고 지금 작동 중입니다. 그냥 한가지 : 귀하의 링크가 깨졌습니다, 당신은 단지 ....까지 복사 ... aspx – octref

+0

@octref 좋은 잡기. 질문과 답변에 대한 수정 사항을 제안 할 수 있으며, 제안 된 수정 사항이 승인되면 담당자에게 알릴 수 있습니다. – cadrell0