2011-02-23 16 views
1

次のRazor Partial ViewとProductがNHibernateマップオブジェクトであることを前提として、ここでIEnumerableを呼び出すとデータベースクエリ(キャッシュされていない場合)が発生します。ASP.NET MVC 3:ビュー内で列挙可能な拡張メソッドを使用する

この悪い習慣ですか?コントローラ/ビジネスロジックでこれらの呼び出しを行うことができるように、私はこのビューのデータをもっと見やすく表示する必要がありますか?

@model IEnumerable<MyProject.Data.Models.Product> 
<table> 
    <tr> 
     <th></th> 
     <th>Total Orders</th> 
     <th>Fulfilled</th> 
     <th>Returned</th> 
     <th>In stock</th> 
    </tr> 
    @foreach (var product in Model) { 
     <tr> 
      <td> 
       @Html.ActionLink(product .Name, "Detail", "Product", new { id = product.Id }, null) 
      </td> 
      <td> 
       @product.Orders.Count 
      </td> 
      <td> 
       @product.Orders.Where(x=>x.Fulfilled).Count() 
      </td> 
      <td> 
       @product.Orders.Where(x=>x.Returned).Count() 
      </td> 
      <td> 
       @(product.Stock.Count - product.Orders.Count) 
      </td> 
     </tr> 
    } 
</table> 

答えて

1

この悪い習慣ですか?

はい。。実際、それはMVCパターンを破っています。つまり、ビューはモデルを呼び戻すべきではなく、HTMLをレンダリングするという唯一の仕事です。

1つのエンティティ以外の追加情報が必要な場合は、ViewModelに必要なすべての情報を入力してから、その情報をビューに渡します。また

表示テンプレートを使用、モデルでIEnumerableていないループを実行します。この方法の利点は、MVCの規則を利用して、明示的なループではない、と付着

@Html.DisplayForModel()

をモデル結合時に階層をモデル化する。

+0

これは簡単な実用的なやり方のようですが、MVCの観点からは間違っていることが分かりました。 –

+0

はい。 @Htmlでない限り、ビューにコードを書くことが始まるときはいつでも。 'の場合は、アラーム音が鳴り、あなたのビュー/コントローラーをリファクタリングして簡単にする必要があります。 ViewModelsまたはControllerにロジックを入れてください。 – RPM1984

+0

HTMLレンダリングロジックをレンダリングするためだけであれば、foreachがモデルからIEnumberableをループするのに間違ったことはありません。ヘルパーは素晴らしいですが、MVCパターンを破ることはありません。 (@ product.Orders.Where(x => x.Fulfilled).Count()) –

関連する問題