ここでは、ロジックとビューを混ぜ合わせて滑りやすい坂道を下っています。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 やTotal
var の使用など)を削減できます。
@model Reports.ViewModels.ContentViewModel
@Html.DisplayFor(m => m.Users)
<div>Total Hours: @Model.TotalHours</div>
Html.DisplayFor
Html.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 用に書かれていますが、それでも適用されます。