【问题标题】:Is conditional logic in an MVC3 view a good practice?MVC3 视图中的条件逻辑是一个好习惯吗?
【发布时间】:2012-01-21 17:56:02
【问题描述】:

这是一个示例视图,我用它来输出我数据库中的每个Category。这是一个递归关系,所以Category 可以有一个List<Category> 的子类别。

@model DSS.WebUI.Models.CategoriaModel

<div class="categories">
    <h3>
        @if (Model.Subcategorias.Count > 0)
        {
            <img src="http://i.imgur.com/t5UXT.gif" />   
            <a href="#">@Model.Nombre</a>
            <p class="subtext">@Model.Encabezado</p>
        }
        else
        {
            <a class="nochild" href="#">@Model.Nombre</a>
            <p class="subtext nochild">@Model.Encabezado</p>
        }
    </h3>
    <div>
        <ul>
            @Html.DisplayFor(x => x.Subcategorias)
        </ul>
    </div>    
</div>

这样的条件逻辑是洁净的吗?还是我应该避免的代码异味以及如何避免?

【问题讨论】:

  • 另一方面,您的 html 似乎很奇怪。 &lt;p&gt;&lt;h3&gt; oO 我只会将 inline/inline-block 元素放在 &lt;h?&gt; 元素中,从不阻塞元素。

标签: c# .net asp.net-mvc-3 view


【解决方案1】:

这种条件逻辑对我来说看起来不错。根据您在视图模型中拥有的子类别的数量,您正在生成一个或另一个 html 片段。糟糕的是,在应用程序的许多地方以相同的输出重复这个完全相同的条件。在这种情况下,您可以将其外部化为部分或编写自定义 HTML 帮助程序。

【讨论】:

    【解决方案2】:

    我认为最好在控制器中实现逻辑而不是 HTML 代码,在这种情况下,我尝试执行以下操作:

        @if (ViewBag.SubCategoryHasData)
        {
            <img src="http://i.imgur.com/t5UXT.gif" />   
            <a href="#">@Model.Nombre</a>
            <p class="subtext">@Model.Encabezado</p>
        }
        else
        {
            <a class="nochild" href="#">@Model.Nombre</a>
            <p class="subtext nochild">@Model.Encabezado</p>
        }
    

    在你的行动中:

        ViewBag.SubCategoryHasData = Subcategorias.Count > 0;
    

    希望对您有所帮助。

    【讨论】:

    • 不确定这是否更好。另外,请不要在模型视图上建议 ViewBags ;)
    • ViewBag 最好使用Nullable&lt;bool&gt;,这样如果不赋值就不会得到NullReferenceException
    • 视图模型比动态 ViewBag 更适合 C# 的静态类型特性。当开发速度优先于可维护性时,我考虑使用它作为捷径。
    • @Boris- 是的,你是对的,但是我们这里有一个列表而不是一个模型,我们应该如何处理这个?
    【解决方案3】:

    你这样做的方式很好。

    只有两件事可以确保您的关注点分离是理想的:

    1. 使用 IEnumerable.Any() 就像在

      中一样
      Subcategorias.Any() 
      

      代替

      Subcategorias.Count > 0;
      

      这更好地表达了您的意图,并且在某些情况下速度更快(在某些情况下,Count 需要遍历整个列表,而 Any() 只需要读取第一项)。

    2. 确保您的 Model.Subcategorias 是一个普通列表。如果您从实体框架模型接收到数据,这可能是一个延迟评估的代理,可能会导致数据库调用。

    【讨论】:

    • 感谢您的建议。是的,Categoria 是一个 POCO 类,而不是 EF 为我加载的东西,所以现在这里有延迟加载问题。 :)
    猜你喜欢
    • 1970-01-01
    • 2016-01-03
    • 1970-01-01
    • 1970-01-01
    • 2011-07-17
    • 2016-04-04
    • 2014-12-22
    • 2020-08-25
    • 2015-05-08
    相关资源
    最近更新 更多