2

たとえば、1ページにレンダリングしたい車両のリストがありますが、車両タイプごとに異なるビュー特性があります。

Vehicle
-VehicleId
-VehicleTypeId(Car / Boat / Truck / etc ...)
-説明
-..。

メインのAllVehiclesPageにアクセスしたい

@foreach(var vehicle in Model) //where Model is a List<Vehicle> from AllVehicles
{
    //Render proper View
    //CarView(vehicle)
    //BoatView(vehicle)
    //TruckView(vehicle)
}

各ビューでは、車両によってレンダリングが異なります。IEホイールのリムサイズは、ボートなどではなく、車/トラックに適用されます。

ビューの継承に関するStackoverflowに関する他の質問をいくつか読みましたが、当てはまらないようです。

これは部分的なビューで行うのが最善ですか?ユーザーコントロールを作成する必要がありますか?

4

1 に答える 1

9

表示テンプレートを使用します。foreachループ全体を次のコード行に置き換えます。

@model IEnumerable<Vehicle>
...
@Html.DisplayForModel()

そして今、興味深い部分があります。処理するタイプごとに表示テンプレートを定義します。

~/Views/Shared/DisplayTemplates/Car.cshtml
~/Views/Shared/DisplayTemplates/Boat.cshtml
~/Views/Shared/DisplayTemplates/Truck.cshtml

各テンプレートは、対応する具象型に強く型付けされます。だからここにHtml.DisplayForModel()ライン上で何が起こるかです:

  1. ASP.NET MVCは、モデルがIEnumerable<Vehicle>
  2. ASP.NETMVCはこのコレクションの列挙を開始します
  3. コレクションの各要素について、ASP.NETMVCは具体的なランタイムタイプを確認します。
  4. ASP.NET MVCは、~/Views/Shared/DisplayTemplatesフォルダーで定義されたこのタイプに対応する表示テンプレートを探し、このテンプレートに現在の要素をモデルとして渡すことにより、自動的にレンダリングします。

このパターンには興味深いものがあります。私は.NET開発者という言葉の代わりにASP.NETMVCという言葉をよく使用しています。開発者がしなければならないのは標準の規則に従うことだけであり、ASP.NET MVCが彼のために仕事をするので、この開発者はループを書く必要がなく、条件があれば書く必要もありません。車輪の再発明が必要です。

于 2012-07-12T19:30:35.590 に答える