2011-04-13 4 views
20

나는 Comment 클래스의 DisplayTemplate을 만들고 Comment/DisplayTemplates/Comment.cshtml 안에 배치했습니다.컬렉션의 각 항목에 DisplayTemplate (DisplayFor 포함) 사용

Comment.cshtml가 제대로 입력되어

@model Comment 

그럼, 내가 모델에 대해 IEnumerable<Comment> 걸리는 부분도 있습니다. 거기에서 컬렉션을 반복하고 Comment 클래스의 DisplayTemplate을 사용하려고합니다. 뷰, 무결성에 :

사전에 전달 모델 항목 유형 '선택 System.Int32'이다

하지만,이 사전 : 그러나

@model IEnumerable<Comment> 

@foreach (var comment in Model.Where(c => c.Parent == null)) { 
    @Html.DisplayFor(model => comment) 
} 

, 나는 Html.DisplayFor 라인에 오류가 'System.String'형식의 모델 항목이 필요합니다.

foreach 루프의 각 항목에 대해 DisplayTemplate을 호출하려면 어떻게해야합니까?

@Html.DisplayFor(x => x.Comments) 

주석 속성이 자동으로 할 것 IEnumerable<Comment>입니다 :

+0

작동합니까 :이 경우

는 DisplayFor 여전히이 같은 루프 내에서 사용할 수 있습니까? –

+0

감사합니다. 조,하지만 그렇지 않습니다. 왜 그랬을까요? 그것의 근거가 된 근거는 무엇입니까? –

답변

31

대신 단순히 적절한 디스플레이 템플릿을 IEnumerable<Comment>을 가지고 가고가하는 모든 루프 컬렉션을 것을 및 전화 뷰를 갖는 이 컬렉션의 각 항목에 대해 Comment.cshtml 표시 템플릿을 반복하고 렌더링합니다. 당신이 정말로 같은 뷰를 필요로하는 경우

아니면 단순히 수 (왜 몰라) :

@model IEnumerable<Comment> 
@Html.DisplayForModel() 

를 아득히 Where 절로 당신은 간단하게 제거하고이 작업을 위임해야 거기에 사용하는 컨트롤러에 연결하십시오. 이러한 작업을 수행하는 뷰가 아니라 뷰 모델을 준비하는 것은 컨트롤러의 책임입니다.

+1

하아! 훌륭한! 나는'DisplayFor'가 자동으로 반복 될지 몰랐다. 물론보기도 없앴습니다. 감사! ('Where' 절에 대해서는 동의합니다. 잠시 동안 게으르다.) –

+0

@Sergi Papaseit, 그 이유는 언제나 누군가가보기에 루프를 작성하는 것을 본다. 나는 항상 템플릿을 사용하여 그를 제안한다. –

+0

글쎄, 난 더 이상 이걸 잊지 않을거야. –

12

허용되는 대답은 대부분 잘 작동하지만 렌더링 할 때 요소 색인을 알고 있어야합니다 (즉, 색인을 기반으로 각 요소에 대한 참조를 생성하는 맞춤 자바 스크립트를 추가해야하는 경우). 당신이 당신의 람다 식의 "myCommentModel"와 같은 뭔가 "모델"을 변경하는 경우

@model IEnumerable<Comment> 

@for (int index = 0; index < Model.Count(); index++) 
{ 
    @Html.DisplayFor(model => model[index]) 
} 
+4

'IEnumerable '는'[i]'로 암시 적 색인을 지원하지 않습니다.논리적으로'model.ElementAt (i)'를 사용하려고 시도하지만 오류가 발생하면 모델 유형으로'Comment []'를 사용하거나 모델 유형으로'model.ToArray() [i]]를 사용하면됩니다. ' – JoeBrockhaus

+0

좋은 물건! 감사! – Funky

관련 문제