在MVC3视图中使用条件逻辑是一个好的实践吗?

3
这是一个示例视图,我使用它来输出数据库中的每个“类别”。这是一种递归关系,因此“类别”可以有子类别的“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看起来有些奇怪。一个<p>标签在<h3>标签内?我只会将inline/inline-block元素放在<h?>标签中,而不是块级元素。 - CodesInChaos
3个回答

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

1

我认为最好将逻辑实现在控制器中而不是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;

希望这可以帮到你。


2
不确定这是否更好。另外,请不要建议使用ViewBags而不是模型视图 ;) - Boris Yankov
最好使用 Nullable<bool> 作为 ViewBag 的类型,这样如果您没有分配值,就不会出现 NullReferenceException - gdoron
视图模型与 C# 的静态类型天然契合,比动态的 ViewBag 更好。我认为当开发速度优先于可维护性时,使用它是一种捷径。 - Boris Yankov
@Boris- 是的,你说得对。但是我们这里有一个列表而不是单个模型,我们应该如何处理? - Saber Amani

1

你的做法很好。

只有两件事需要确保你的关注点分离是理想的:

  1. 使用IEnumerable.Any(),例如

    Subcategorias.Any() 
    

    而不是

    Subcategorias.Count > 0;
    

    这样表达你的意图更清晰,在某些情况下也更快(在某些情况下,Count需要遍历整个列表,而Any()只需要读取第一项)。

  2. 确保你的Model.Subcategorias是一个普通的List。如果你从Entity Framework模型中接收到数据,它可能是一个惰性评估的代理,并可能导致数据库调用。


感谢您的建议。是的,Categoria 是一个 POCO 类,而不是 EF 为我加载的内容,所以现在没有懒加载问题了。 :) - Only Bolivian Here

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接