我知道视图中不应包含代码,但在我正在处理的项目中,我在视图中有很多逻辑。
我的主页有
<% Html.RenderPartial("SearchResults"); %>
现在在局部视图中,我有很多这样的逻辑;
<div id="RestaurantsList">
<%if (Model.restaurantsList.Count() > 0)
{
foreach (var item in Model.restaurantsList)
{ %>
<% Html.RenderPartial("SearchResult", item); %>
<%
} %>
<%
}
else
{
Html.RenderPartial("NoResults");
} %>
现在我可以让家庭控制器返回一个基于列表为空的不同视图,但我真的不想这样,因为索引视图有一些我想要显示的东西,无论是否有结果。< / p>
我能想到的另一件事就是将它封装在一个辅助方法中,比如Html.SearchResults。但是我需要帮助器来为每个搜索结果调用renderPartial。这似乎不是关心的清晰分离。
我仍然需要在局部视图中使用第一个if语句。
你最好怎么处理这个?
答案 0 :(得分:13)
我个人认为这是可以的。您使用的逻辑与模型的显示方式完全相关。
您只需要注意并确保您永远不会混淆业务逻辑,数据访问逻辑或其他任何与模型显示没有严格关联的内容。
答案 1 :(得分:10)
我同意Praveen Angyan的回答。我唯一可以说的是扩展他的答案是将一些逻辑放在ViewModel中。
例如,在ViewModel中你可以隐藏
Model.restaurantsList.Count() > 0
在方法或属性后面。
E.G:
<%if (Model.HasResturant){...}%>
答案 2 :(得分:1)
这个答案与你的问题无关。
但是,我只想告诉您,在循环中调用Html.RenderPartial()效率不高。
ASP.NET MVC - For loop inside RenderPartial or Outside RenderPartial
将它改成下面的内容会更好。
<%if (Model.restaurantsList.Count() > 0)
{
// render the Restaurant item right away
foreach (var item in Model.restaurantsList) { %>
<div>
<%= Html.Encode(item.RestaurantName); %><br />
<%= Html.Encode(item.Address); %>
</div>
<% }
}
else
{
Html.RenderPartial("NoResults");
} %>
答案 3 :(得分:1)
Praveen Angyan是正确的 - 这是观点逻辑,它很好,它就在它的位置 但这并没有改变对整洁观点的需求。
只想分享小改进 如果我们附加微小的HtmlHelper方法,我们可以将视图缩短为这样:
<div id="RestaurantsList">
<% if (Model.HasRestaurants)
Html.RenderPartialForEach("SearchResult", Model.restaurantsList);
else
Html.RenderPartial("NoResults"); %>
</div>
对某些人来说 - 它可能看起来不那么可读,但它对我来说足够好。