Asp.net mvc 为集合中的每个项目使用DisplayTemplate(带DisplayFor)

Asp.net mvc 为集合中的每个项目使用DisplayTemplate(带DisplayFor),asp.net-mvc,asp.net-mvc-3,razor,display-templates,Asp.net Mvc,Asp.net Mvc 3,Razor,Display Templates,我已经为Comment类创建了一个DisplayTemplate,并将其放在Comment/DisplayTemplates/Comment.cshtml中 Comment.cshtml键入正确: @model Comment 然后,我有一个局部视图,它对模型采用IEnumerable。在那里,我在集合中循环,并希望为Comment类使用DisplayTemplate。从整体上看,该观点: @model IEnumerable<Comment> @foreach (var com

我已经为
Comment
类创建了一个DisplayTemplate,并将其放在
Comment/DisplayTemplates/Comment.cshtml

Comment.cshtml
键入正确:

@model Comment
然后,我有一个局部视图,它对模型采用
IEnumerable
。在那里,我在集合中循环,并希望为
Comment
类使用DisplayTemplate。从整体上看,该观点:

@model IEnumerable<Comment>

@foreach (var comment in Model.Where(c => c.Parent == null)) { 
    @Html.DisplayFor(model => comment)
}
@model IEnumerable
@foreach(模型中的var注释,其中(c=>c.Parent==null)){
@DisplayFor(model=>comment)
}
但是,我在
Html.DisplayFor
行中得到一个错误:

传递到字典中的模型项的类型为“System.Int32”,但此字典需要类型为“System.String”的模型项


如何为
foreach
循环中的每个项目调用DisplayTemplate?

而不是拥有一个采用
IEnumerable
的视图,它所做的只是在集合中循环并调用适当的显示模板:

@Html.DisplayFor(x => x.Comments)
其中Comments属性是一个
IEnumerable
,它将自动执行循环并呈现此集合中每个项目的
Comment.cshtml
显示模板


或者,如果您真的需要这样的视图(不知道为什么),您可以简单地:

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

至于您在其中使用的
Where
子句,您只需将其删除并将此任务委托给控制器即可。控制器负责准备视图模型,而不是执行此类任务的视图。

虽然接受的答案在大多数情况下都很有效,但在其他情况下,我们需要在呈现时了解元素的索引(即添加自定义javascript,根据每个元素的索引生成引用)

在这种情况下,DisplayFor仍可以在循环中使用,如下所示:

@model IEnumerable<Comment>

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

Hah!明亮的我不知道
DisplayFor
会自动循环。当然,我也摆脱了这个观点。谢谢(我同意
Where
子句,我在那里懒了一分钟;)@Sergi Papaseit,这就是为什么每次我看到有人在视图中编写循环时,我总是建议他使用模板。好吧,我当然不会再忘记这一点:)@DarinDimitrov你知道为什么这在我的情况下不起作用吗“或者如果你真的需要这样的视图(不知道为什么)。
DisplayFor
可以呈现列表,但它不会呈现表格。如果在lambda表达式中将“model”更改为类似“myCommentModel”的内容,它会工作吗?谢谢Joe,但不会。为什么会这样?背后的原理是什么?
IEnumerable
不支持
[i]的隐式索引
。从逻辑上讲,您将尝试使用
model.ElementAt(i)
,但随后会出现错误,因此只能使用
Comment[]
作为模型类型或
model.ToArray()[i]