MVC Razor @foreach

我听说在视图里面有@foreach是不可能的。 意思是说,这个观点不应该有任何逻辑。 @foreach逻辑的最佳实践是什么?

@foreach.. 

@foreach逻辑的最佳实践是什么?

无处不在,只是摆脱它。 你可以使用编辑器或显示模板。

举个例子:

 @foreach (var item in Model.Foos) { <div>@item.Bar</div> } 

可以很好地被显示模板replace:

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

然后你将定义相应的显示模板(如果你不喜欢默认的模板)。 所以你可以定义一个可重用的模板~/Views/Shared/DisplayTemplates/Foo.cshtml ,这个模板会自动被Foos集合的每个元素( IEnumerable<Foo> Foos { get; set; } )渲染:

 @model Foo <div>@Model.Bar</div> 

显然,完全相同的约定适用于编辑器模板,如果您希望显示一些input字段,以便您可以编辑视图模型,而不是仅将其显示为只读模式,则应使用该编辑器模板。

当人们说不把逻辑放在视图中时,通常是指业务逻辑,而不是渲染逻辑。 在我看来,我认为在视图中使用@foreach是完全正确的。

当我发送包含实体列表的实体(例如,在1视图中显示2个网格)时使用@foreach

例如,如果我以模型forms发送包含Foo1(List<Foo1>)Foo2(List<Foo2>)的实体Foo

我可以参考第一个列表:

 @foreach (var item in Model.Foo.Foo1) { @Html.DisplayFor(modelItem=> item.fooName) } 

对@DarinDimitrov的回复,我已经在剃刀视图中使用了foreach。

 <li><label for="category">Category</label> <select id="category"> <option value="0">All</option> @foreach(Category c in Model.Categories) { <option title="@c.Description" value="@c.CategoryID">@c.Name</option> } </select> </li> 

使用重载指示模板@Html.DisplayFor(x => x.Foos, "YourTemplateName)时,答案将不起作用。

似乎是这样devise的, 看到这种情况 。 框架给出的例外(关于types不如预期)是相当误导和欺骗我的第一次尝试(谢谢@CodeCaster)

在这种情况下, 你必须使用@foreach

 @foreach (var item in Model.Foos) { @Html.DisplayFor(x => item, "FooTemplate") }