c# - 如何避免在 View 中循环?

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

当我构建 View 时,我希望尽可能多地消除处理逻辑。理想情况下,我希望只使用 HTML 并使用 Razor 呈现值。

假设我有一个带有 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>

有什么方法可以避免在我看来使用循环?

最佳答案

虽然在 MVC View 中循环不一定是坏事,但一些纯粹主义者(就像您一样)更喜欢保持他们的 View super 干净并且没有任何处理逻辑。

对您来说幸运的是,MVC 中有一个鲜为人知的 gem ,它可以获取一个 IEnumerable 对象列表,并将其呈现给绑定(bind)到单个对象的编辑器/显示模板——它会为您处理循环。

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

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

现在,在您的 View 中,您可以简单地使用 Html.DisplayFor 调用显示模板,并将完整列表作为模型传递:

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

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

当然,对于您的简单示例,这完全取决于个人喜好,因为这并没有太大的好处,除非您只是想摆脱循环逻辑。

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

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

但是,如果是这种情况,我建议完全按照您需要在 View 中显示的方式设置列表。也就是说,在构建列表的 Controller /服务中进行任何过滤/排序,让您的 View 只渲染您的模型。

关于c# - 如何避免在 View 中循环?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13648174/

相关文章:

asp.net-mvc-3 - ASP.NET MVC SSL 连接的用户名和密码登录

c# - 在 ASP.NET MVC 3 中缓存数据

c# - 如何保存与现有实体有父关系的新实体?

asp.net-mvc - POST 操作方法中的强类型 ViewModel 仅包含空值

C# 字段与属性

asp.net-mvc - 防止 IIS 通过 ASP.NET 管道提供静态文件

asp.net-mvc - 域驱动设计新手,请简要说明 'value objects'和 'services'

c# - 在 MVC3 中的每个 Action 之前运行一个方法

c# - 我需要使用 2 个不同的 SoapServices 但我当时只能访问 1 个,为什么?

c# - 如何从 List<string> 中删除相同的项目?