MVC Razor @foreach

时间:2012-06-29 12:14:00

标签: asp.net-mvc razor

我听说在视图中使用@foreach是禁忌。意思是,视图中不应该有任何逻辑。什么是@foreach逻辑应该在哪里的最佳实践?

    @foreach.. 

5 个答案:

答案 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")
}