91

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

    @foreach.. 
4

5 回答 5

182

@foreach 的逻辑应该在哪里的最佳实践是什么?

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

例如:

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

完全可以用显示模板代替:

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

然后您将定义相应的显示模板(如果您不喜欢默认的)。因此,您将定义一个可重用的模板~/Views/Shared/DisplayTemplates/Foo.cshtml,该模板将由框架自动为 Foos 集合 ( IEnumerable<Foo> Foos { get; set; }) 的每个元素呈现:

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

显然,完全相同的约定适用于编辑器模板,如果您想显示一些允许您编辑视图模型的输入字段,而不是仅将其显示为只读,则应使用这些约定。

于 2012-06-29T12:17:13.657 回答
104

当人们说不要在视图中放置逻辑时,他们通常指的是业务逻辑,而不是渲染逻辑。以我的拙见,我认为在视图中使用 @foreach 非常好。

于 2012-06-29T12:23:19.230 回答
15

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

例如,如果我将包含Foo1(List<Foo1>)和的实体 Foo 作为模型发送Foo2(List<Foo2>)

我可以参考第一个列表:

@foreach (var item in Model.Foo.Foo1)
{
    @Html.DisplayFor(modelItem=> item.fooName)
}
于 2012-06-29T12:21:39.173 回答
11

对于我在剃刀视图中使用 foreach 的情况,回复@DarinDimitrov。

<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>
于 2012-06-29T12:29:38.960 回答
5

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

似乎是这样设计的,看这个案例。此外,框架给出的异常(关于类型不符合预期)非常误导并在第一次尝试时愚弄了我(感谢@CodeCaster)

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

@foreach (var item in Model.Foos)
{
    @Html.DisplayFor(x => item, "FooTemplate")
}
于 2015-09-05T11:07:05.357 回答