如何避免在视图中循环?

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

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

public class FooModel { public List 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 
@Model.FoosFirstValue
@Model.FoosOtherValue
Bars:
    @foreach (var bar in Model.Bars) {
  • @bar.SomeValue: @bar.SomeOtherValue
  • }

反正在我看来是否避免使用循环?

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

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

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

 @model MyApp.BarModel 
  • @Model.SomeValue: @Model.SomeOtherValue
  • 现在,在您的视图中,您可以使用Html.DisplayFor简单地调出显示模板,并将完整列表作为模型传递:

     
    Bars:
      @Html.DisplayFor(m => m.Bars)

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

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

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

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

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