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]