Asp.net mvc 在ASP.NET MVC中删除部分视图中的逻辑
我知道视图中不应该有代码,但在我正在进行的项目中,视图中有很多逻辑 我的主页有Asp.net mvc 在ASP.NET MVC中删除部分视图中的逻辑,asp.net-mvc,refactoring,partial-views,Asp.net Mvc,Refactoring,Partial Views,我知道视图中不应该有代码,但在我正在进行的项目中,视图中有很多逻辑 我的主页有 <% Html.RenderPartial("SearchResults"); %> 现在在局部看来,我有很多这样的逻辑 <div id="RestaurantsList"> <%if (Model.restaurantsList.Count() > 0) { foreach (var item in Model.restaurantsList) { %>
<% 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");
} %>
0)
{
foreach(Model.restaurantsList中的var项)
{ %>
现在,我可以让主控制器根据列表为空返回不同的视图,但我真的不希望这样,因为无论是否有结果,索引视图都有一些我想要显示的内容
这里我唯一能想到的另一件事是将它封装在一个助手方法中,比如Html.SearchResults。但是,我还需要助手为每个搜索结果调用renderPartial。这看起来不像是完全分离关注点
不过,我仍然需要在部分视图中使用第一个if语句
您如何最好地处理此问题?我个人的意见是,这没关系。您所使用的逻辑完全与模型的显示方式有关
你只需要意识到并确保永远不要混入业务逻辑、数据访问逻辑或任何与模型显示无关的东西。我同意Praveen Angyan的答案。我唯一能说的是扩展他的答案是将一些逻辑放在ViewModel中 例如,在ViewModel中,可以隐藏
Model.restaurantsList.Count()>0
在方法或属性后面
例如:
此答案与您的问题无关 但是,我只想让您知道,在循环中调用Html.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");
} %>
0)
{
//马上把餐厅的东西弄出来
foreach(Model.restaurantsList中的var项){%>
Praveen Angyan是正确的-这是视图逻辑,它在哪里就好了。但这并没有改变人们对整洁视图的需求 只是想分享一些小的改进。
如果我们附加微小的HtmlHelper方法,我们可以将视图缩短为以下内容:
<div id="RestaurantsList">
<% if (Model.HasRestaurants)
Html.RenderPartialForEach("SearchResult", Model.restaurantsList);
else
Html.RenderPartial("NoResults"); %>
</div>
对于一些人来说,它可能看起来不可读,也不好看,但对我来说已经足够好了。+1一直想知道这种情况下的最佳实践是什么。是的,我想知道。所以显示逻辑没问题。我很快就会接受你的答案。我想先看看是否还有其他机会;)除非在mvc3中发生了一些变化,这是完全正确的IEW引擎不会缓存已找到的部分,并且必须在每次迭代中“重新查找”它们。
<div id="RestaurantsList">
<% if (Model.HasRestaurants)
Html.RenderPartialForEach("SearchResult", Model.restaurantsList);
else
Html.RenderPartial("NoResults"); %>
</div>