24

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

Comment.cshtml输入正确:

@model Comment

然后,我有一个采用IEnumerable<Comment>for 模型的局部视图。在那里,我遍历集合并希望将 DisplayTemplate 用于Comment该类。观点的完整性:

@model IEnumerable<Comment>

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

但是,我收到一条错误Html.DisplayFor消息:

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

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

4

2 回答 2

34

而不是拥有一个视图,IEnumerable<Comment>它所做的只是遍历集合并简单地调用正确的显示模板:

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

其中 Comments 属性是一个IEnumerable<Comment>,它将自动执行循环并Comment.cshtml为该集合的每个项目呈现显示模板。

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

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

至于Where您在那里使用的子句,您应该简单地删除它并将此任务委托给控制器。准备视图模型是控制器的责任,而不是执行此类任务的视图。

于 2011-04-13T16:31:27.020 回答
13

虽然接受的答案在大多数情况下都能正常工作,但在其他情况下,我们需要在渲染时了解元素的索引(即添加自定义 javascript,根据其索引生成对每个元素的引用)。

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

@model IEnumerable<Comment>

@for (int index = 0; index < Model.Count(); index++)
{
     @Html.DisplayFor(model => model[index])
}
于 2012-02-16T13:41:45.613 回答