MVC3视图中的条件逻辑是一种好的做法吗
本文关键字:一种 视图 条件逻辑 MVC3 | 更新日期: 2023-09-27 18:20:55
下面是一个示例视图,我使用它来输出数据库中的每个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片段。糟糕的是在应用程序的许多地方用相同的输出重复这种完全相同的条件。在这种情况下,您可以将其外部化为分部或编写自定义HTML帮助程序。
我认为最好在控制器中实现逻辑,而不是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;
希望这能有所帮助。
这样做很好。
只有两件事可以确保您的关注点分离是理想的:
-
在中使用IEnumerable.Any()
Subcategorias.Any()
的安装
Subcategorias.Count > 0;
这可以更好地表达您的意图,在某些情况下速度更快(在某些情况中,Count需要遍历整个列表,而Any()需要只读取第一项)。
-
确保你的模型。子类别是一个简单的列表。如果您已经从实体框架模型接收到数据,那么这可能是一个延迟评估的代理,并可能导致数据库调用。