我听说在视图中使用@foreach是禁忌。意思是,视图中不应该有任何逻辑。什么是@foreach逻辑应该在哪里的最佳实践?
@foreach..
答案 0 :(得分:141)
@foreach逻辑应该在哪里的最佳实践是什么?
无处可去,只是摆脱它。您可以使用编辑器或显示模板。
例如:
@foreach (var item in Model.Foos)
{
<div>@item.Bar</div>
}
完全可以被显示模板替换:
@Html.DisplayFor(x => x.Foos)
然后您将定义相应的显示模板(如果您不喜欢default one)。因此,您将定义一个可重用的模板~/Views/Shared/DisplayTemplates/Foo.cshtml
,该模板将由框架自动呈现给Foos集合的每个元素(IEnumerable<Foo> Foos { get; set; }
):
@model Foo
<div>@Model.Bar</div>
显然,完全相同的约定适用于编辑器模板,如果您想要显示一些输入字段,允许您编辑视图模型,而不是仅显示为只读,则应使用这些模板。
答案 1 :(得分:85)
当人们说不在视图中放置逻辑时,它们通常指的是业务逻辑,而不是渲染逻辑。在我的拙见中,我认为在视图中使用@foreach是完全没问题的。
答案 2 :(得分:12)
当我发送包含实体列表的实体时(例如在1个视图中显示2个网格),我正在使用@foreach
例如,如果我作为模型发送包含Foo1(List<Foo1>)
和Foo2(List<Foo2>)
的实体Foo
我可以参考第一个List:
@foreach (var item in Model.Foo.Foo1)
{
@Html.DisplayFor(modelItem=> item.fooName)
}
答案 3 :(得分:8)
对@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>
答案 4 :(得分:2)
@Html.DisplayFor(x => x.Foos, "YourTemplateName)
时,The answer将无效。
似乎是这样设计的,see this case。框架给出的例外情况(关于类型没有按预期的那样)是非常误导并且在第一次尝试时欺骗了我(感谢@CodeCaster)
在这种情况下你必须使用@foreach
@foreach (var item in Model.Foos)
{
@Html.DisplayFor(x => item, "FooTemplate")
}