2009-06-05 51 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> 

對於一些 - 它可能看起來不讀取和漂亮,但它適合我不夠好。