ここでは、ロジックとビューを混ぜ合わせて滑りやすい坂道を下っています。MVC は、さまざまなレイヤー (モデル、ビュー、およびコントローラー) 間の結合を減らして、特にコードの保守とテストを容易にするように設計されています。
それでは、それを少しきれいにしてみましょう。まず、Totalはデータの一部であり、モデルの一部である必要があることを意味します。
public class ContentViewModel
{
public List<User> Users { get; set; }
public int TotalHours
{
get
{
return Users.Sum(u => u.Hours); // Assuming User has an Hours property
}
}
}
コントローラーは、モデルの作成とデータの提供を処理する必要があります。このようなもの:
public ActionResult Index()
{
ContentViewModel viewModel = new ContentViewModel();
viewModel.Users = db.Users.ToList();
return View(viewModel);
}
必要なデータが揃ったので、ビューで現在使用している多くのロジック (foreach やTotalvar の使用など)を削減できます。
@model Reports.ViewModels.ContentViewModel
@Html.DisplayFor(m => m.Users)
<div>Total Hours: @Model.TotalHours</div>
Html.DisplayForHtml.EditorFor表示/エディター テンプレートと呼ばれるものを使用すると、コレクションを自動的にループして、各アイテムのテンプレートをレンダリングします。でこれを利用するにはContentViewModel、表示テンプレートを作成する必要があります。これを行うには、ビューがある場所の下にフォルダーを作成し、名前を付ける必要がありますDisplayTemplates。たとえば、ビューが~/Views/Home/Index.cshtmlの場合、フォルダを作成する必要があります: ~/Views/Home/DisplayTemplates。
そのフォルダーを右クリックして、新しいビューを追加します。表示されるダイアログ ボックスで、厳密に型指定されたビューを作成し、テンプレートに渡したい型を選択して (私の例でUserは型ではなくList<User>)、それを部分ビューにして、必ずそれを指定します。タイプと同じ名前 (再びUser)。テンプレートを作成したら、通常のビューと同じように HTML ヘルパーを使用できます。このようなもの:
@model Models.User
@Html.LabelFor(m => m.Name)
@Html.DisplayFor(m => m.Name)
これで、扱いやすいチャンクに分割されました。表示/エディタ テンプレートの使用について詳しく知りたい場合は、このテーマに関する Brad Wilson の記事シリーズを読むことを強くお勧めします。MVC 2 用に書かれていますが、それでも適用されます。