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 似乎很奇怪。<p>
内 <h3>
oO 我只会将 inline
/inline-block
元素放在 <h?>
元素中,从不阻塞元素。
【参考方案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<bool>
,这样如果不赋值就不会得到NullReferenceException
。
视图模型比动态 ViewBag 更适合 C# 的静态类型特性。当开发速度优先于可维护性时,我考虑使用它作为捷径。
@Boris- 是的,你是对的,但是我们这里有一个列表而不是一个模型,我们应该如何处理这个?【参考方案3】:
你这样做的方式很好。
只有两件事可以确保您的关注点分离是理想的:
使用 IEnumerable.Any() 就像在
中一样Subcategorias.Any()
代替
Subcategorias.Count > 0;
这更好地表达了您的意图,并且在某些情况下速度更快(在某些情况下,Count 需要遍历整个列表,而 Any() 只需要读取第一项)。
确保您的 Model.Subcategorias 是一个普通列表。如果您从实体框架模型接收到数据,这可能是一个延迟评估的代理,可能会导致数据库调用。
【讨论】:
感谢您的建议。是的,Categoria
是一个 POCO 类,而不是 EF 为我加载的东西,所以现在这里有延迟加载问题。 :)以上是关于MVC3 视图中的条件逻辑是一个好习惯吗?的主要内容,如果未能解决你的问题,请参考以下文章