如何避免在视图中循环?(How can I avoid looping in a View?)

2019-07-04 07:50发布

当我建立我的意见,我想消灭尽可能多的处理逻辑成为可能。 理想情况下,我想坚持只用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; }
}

而在我看来,我需要通过循环和显示元件在我的酒吧:

@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>

反正是有避免使用在我看来,一个循环?

Answer 1:

虽然在MVC视图循环并不一定是坏事,一些较真(像你似乎是)更愿意保持自己的观点超清洁,无任何处理逻辑的空白。

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

例如,如果你设置了显示模板局部视图,让我们把它BarModel.cshtml(应被存储在一个PartialViewLocationFormats搜索路径 ,一个“DispalyTemplate”子文件夹下):

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

现在,在你看来,你可以简单地使用调出该显示模板Html.DisplayFor ,并传递完整列表作为模型:

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

仅此而已。 这将需要你的BarModels的名单,并为列表中的每个对象BarModel部分显示tempalte。

当然,你简单的例子,它是真正个人喜好,因为这不是一个重大的好处,除非你只是只是想摆脱循环逻辑的。

但是,如果你需要在同一个视图中的多个位置分享这个显示模板,或以不同的看法,它确实不负有心人建立你的看法是这样,并降低复杂性和代码重复。

另外一个侧面说明:这种方法假设要在列表中显示的每个项目,并在订货它存储在列表中。 如果您需要有条件地显示项目,或者希望以不同的顺序来显示,这种方法是行不通的。

但是,如果是这样的话,我会建议设置完全一样,你需要在视图中显示的列表。 也就是说,做任何过滤/控制器/服务,建立在列表中的排序,并留下您的看法,只是渲染你的模型。



文章来源: How can I avoid looping in a View?