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>