2009-06-05 49 views
7

我知道视图不应该有代码,但在我正在处理的项目中,我在视图中有很多逻辑。从ASP.NET MVC的部分视图中删除逻辑

我的主页上有

<% Html.RenderPartial("SearchResults"); %> 

现在我有一个aweful很多像这样的逻辑的局部视图;

<div id="RestaurantsList"> 
<%if (Model.restaurantsList.Count() > 0) 
{ 
    foreach (var item in Model.restaurantsList) 
    { %> 
     <% Html.RenderPartial("SearchResult", item); %> 

    <% 
    } %> 
<% 
} 
else 
{ 
    Html.RenderPartial("NoResults"); 

} %> 

现在我可以让家庭控制器返回基于该列表是空上有不同的看法,但我真的不希望,作为索引视图有我想要显示无论几件事情如果有结果或没有。

我能想到的唯一的其他事情就是封装在一个像Html.SearchResults这样的辅助方法中。但是之后我需要助手为每个搜索结果调用renderPartial。这似乎并没有让人担忧。

虽然我仍然必须在部分视图中拥有第一个if语句。

你最好怎么处理?

+0

+1总是想知道在这种情况下最佳做法是什么。 – 2009-06-05 16:28:00

回答

13

我的个人意见是,这没关系。您使用的逻辑与模型需要如何显示完全相关。

您只需要注意并确保您不会混淆业务逻辑,数据访问逻辑或与模型显示没有严格关联的其他任何内容。

+0

是的,我想知道。所以显示逻辑可以。 我很快就会接受你的回答。我想看看是否有其他的oppinions第一;) – ddd 2009-06-05 18:35:37

10

我同意Praveen Angyan的回答。我唯一可以说的延伸他的答案是将一些逻辑放在ViewModel中。

例如,在视图模型,你可以隐藏

Model.restaurantsList.Count() > 0

方法或属性后面。

例如为:

<%if (Model.HasResturant){...}%> 
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");  
} %> 
+0

除非在mvc3有什么改变这是完全正确的。视图引擎不会缓存已经找到的部分,并且每次迭代都必须“重新渲染”它们。 – 2011-02-19 17:15:45

1

Praveen Angyan是正确的 - 这是视图的逻辑,它是好的,它是在哪里。
但这并不改变对整洁观点的需求。

只是想分享小的改进。
如果我们重视微小的HtmlHelper方法,我们可以缩短为了这样的事情:

<div id="RestaurantsList"> 
<% if (Model.HasRestaurants) 
    Html.RenderPartialForEach("SearchResult", Model.restaurantsList);  
else  
    Html.RenderPartial("NoResults"); %> 
</div> 

对于一些 - 它可能看起来不读取和漂亮,但它适合我不够好。