这是一个示例视图,我使用它来输出数据库中的每个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>
这样的条件逻辑是犹太教徒吗?或者这是我应该避免的代码味道以及如何?
答案 0 :(得分:7)
这种条件逻辑对我来说很好看。根据视图模型中的子类别数,您将生成一个或另一个html片段。在您的应用程序的许多地方使用相同的输出重复这个完全相同的条件会有什么不好。在这种情况下,您可以将其外部化为部分或编写自定义HTML帮助程序。
答案 1 :(得分: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 :(得分:1)
你这样做很好。
确保您的关注点分离是理想的两件事:
使用 IEnumerable.Any(),如
Subcategorias.Any()
的实例
Subcategorias.Count > 0;
这更好地表达了你的意图,在某些情况下更快(在某些情况下,Count需要遍历整个列表,而Any()需要只读取第一个项目。)
确保您的Model.Subcategorias是普通列表。如果您已收到实体框架模型中的数据,则可能是一个延迟评估的代理,可能会导致数据库调用。