MVC3 视图中的条件逻辑是一个好习惯吗?

Posted

技术标签:

【中文标题】MVC3 视图中的条件逻辑是一个好习惯吗?【英文标题】:Is conditional logic in an MVC3 view a good practice? 【发布时间】: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; 元素中,从不阻塞元素。 【参考方案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】:

你这样做的方式很好。

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

    使用 IEnumerable.Any() 就像在

    中一样
    Subcategorias.Any() 
    

    代替

    Subcategorias.Count > 0;
    

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

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

【讨论】:

感谢您的建议。是的,Categoria 是一个 POCO 类,而不是 EF 为我加载的东西,所以现在这里有延迟加载问题。 :)

以上是关于MVC3 视图中的条件逻辑是一个好习惯吗?的主要内容,如果未能解决你的问题,请参考以下文章

如何比较 SQL where 条件中的两个逻辑表达式? [关闭]

一些代码中的逻辑习惯

在“for”循环条件中使用“三元运算”是一种好习惯吗?

将函数放在 useEffect 中是一种好习惯吗?

使用条件逻辑组合 HTML 视图

我可以简化这个使用逻辑否定运算符的条件语句吗?