如何避免在视图中循环?

时间:2012-11-30 15:29:46

标签: c# asp.net-mvc asp.net-mvc-3 razor asp.net-mvc-4

当我构建视图时,我想尽可能多地消除处理逻辑。理想情况下,我只想坚持使用Razor创建HTML和渲染值。

假设我有一个带有BarModel对象列表的FooModel:

public class FooModel
{
    public List<BarModel> Bars { get; set; }

    public string FoosFirstValue { get; set; }
    public string FoosOtherValue { get; set; }
}

public class BarModel
{
    public string SomeValue { get; set; }
    public string SomeOtherValue { get; set; }
}

在我看来,我需要循环并在我的Bars上显示元素:

@model MyApp.FooModel
<div>@Model.FoosFirstValue</div>
<div>@Model.FoosOtherValue </div>
<div>
    Bars:
    <ul>
        @foreach (var bar in Model.Bars)
        {
            <li>@bar.SomeValue: @bar.SomeOtherValue</li>
        }
    </ul>
</div>

无论如何都要避免在我看来使用循环吗?

1 个答案:

答案 0 :(得分:12)

虽然在MVC视图中循环并不一定是坏事,但是一些纯粹主义者(比如你似乎)更喜欢保持他们的观点超级干净,没有任何处理逻辑。

幸运的是,在MVC中有一个鲜为人知的宝石,它可以获取IEnumerable对象列表,并将其渲染到绑定到单个对象的编辑器/显示模板 - 它为您处理循环。

例如,如果您设置了显示模板局部视图,我们将其称为BarModel.cshtml(应存储在PartialViewLocationFormats search paths中的一个“DispalyTemplate”子文件夹下):

@model MyApp.BarModel
<li>@Model.SomeValue: @Model.SomeOtherValue</li>

现在,在您的视图中,您只需使用Html.DisplayFor调出显示模板,然后将完整列表作为模型传递:

<div>
    Bars:
    <ul>
        @Html.DisplayFor(m => m.Bars)
    </ul>
</div>

就是这样。它将获取您的BarModel列表,并为列表中的每个BarModel对象生成部分显示tempalte。

当然,举个简单的例子,它实际上取决于个人偏好,因为没有什么大的好处,除非你只是想摆脱循环逻辑。

但是,如果您需要在同一视图或不同视图中的多个位置共享此显示模板,那么构建您的视图并降低复杂性和代码重复确实是值得的。

另一个注意事项:此方法假定您要显示列表中的每个项目,并按照它列表中的顺序显示。如果您需要有条件地显示项目,或者想要以不同的顺序显示,则此方法将不起作用。

但是,如果是这种情况,我建议您完全根据需要在视图中显示列表。也就是说,在构建列表的控制器/服务中进行任何过滤/排序,并让您的视图只是渲染模型。