2009-06-05 18 views
7

私は、ビューにはコードが含まれてはいけませんが、作業中のプロジェクトではビューに多くのロジックがあることを認識しています。ASP.NET MVCの部分ビューからロジックを削除する

マイホームページでは、私はこのようなロジックのaweful多くを持っている部分図に今

<% 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"); 

} %> 

今私は、ホームコントローラが空であることのリストに基づいて別のビューを返すようでしたが、私は本当にIndexビューとして私がしたいいくつかのことは関係なく表示されていることを望んでいません結果があるかどうか。

ここで私が考えることができるのは、Html.SearchResultsのようなヘルパーメソッドでこれをカプセル化することだけです。しかし、私はヘルパがそれぞれの検索結果のためにrenderPartialを呼び出す必要があります。それは懸念のきれいな分離のようには見えません。

私はまだ部分的なビューで最初のifステートメントを持っている必要があります。

これはどうやって処理しますか?

+0

+1この場合、ベストプラクティスが何であるか常に疑問に思っています。 –

答えて

13

私の個人的な意見はこれが問題ではないということです。使用したロジックは、モデルをどのように表示する必要があるかに完全に関係しています。

ビジネスロジック、データアクセスロジック、またはモデルの表示に厳密に結び付けられていないものが混在していないことを確認してください。

+0

うん、私はそれを疑問に思った。だから、表示ロジックは大丈夫です。 すぐに回答を受け付けます。私は最初に他の意見があるかどうか確認したい) – ddd

10

私はPraveen Angyanの答えに同意します。私が答えを広げるために言うことができるのは、ロジックのいくつかをViewModelに入れることだけです。

の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で何かが変更されていない限り、これは完全に真です。ビューエンジンは発見されたパーシャルをキャッシュしません。すべての反復を「リフレッシュ」する必要があります。 –

1

Praveen Angyanは正解です。これはビューロジックであり、それがどこにあるかは問題ありません。
しかし、それは見やすいビューの必要性を変えません。

ちょっとした改善をしたかっただけです。私たちは小さなHtmlHelperのメソッドを添付する場合は
することは、我々はこのような何かにビューを短縮することができますいくつかのために

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

- それは読みやすく、見栄えないかもしれませんが、それは私のために十分収まります。

関連する問題