2

モデルとして基本型の IEnumerable があります。

具象型に応じて、異なるビットの HTML をリストに表示する必要があります。

したがって、結果のリストは HTML では次のようになります。

<ul>
  <li class="points">Points - Item 1 - 10 points <a href="#">Remove</a></li>
  <li class="media">Media - Item 2 - your_uploaded_image.jpg <a href="#">Remove</a></li>
  <li class="content">Content - Item 3 <a href="#">Remove</a></li>
</ul>

後でこれに別のタイプを追加する可能性が高いため、次のようなソリューションは実際には私が求めているものではありません.

@foreach(var item in Model)
{
   if(item is PointImpl)
   {
       var pointItem = item as PointImpl;
       <li class="points">Points - @pointItem.Name - @pointItem.Points points <a href="#">Remove</a></li>
   }
   else if(item is MediaImpl)
   {
       var mediaItem = item as MediaImpl; 
       <li class="media">Media - @mediaItem.Name - @mediaItem.FileName  <a href="#">Remove</a></li>
   }
   /*
       More implementations
   */
}

モデル メタデータ テンプレートのヒントを見てきましたが、モデルが IEnumerable であるため、実際には役に立ちません。

具象型の属性を調べるカスタム Html ヘルパーについて考えていましたが、これを行う方法が組み込まれていると思いますか?

4

1 に答える 1

6

見苦しいのではなく、foreach単純に表示テンプレートを使用します。

@model IEnumerable<SomeBaseViewModel>
<ul>
    @Html.DisplayForModel()
</ul>

次に、すべての子タイプの表示テンプレートを定義します。例えば:

~/Views/Shared/DisplayTemplates/PointImpl.cshtml:

@model PointImpl
<li class="points">
    Points - @Model.Name - @Model.Points points 
    <a href="#">Remove</a>
</li>

および: ~/Views/Shared/DisplayTemplates/MediaImpl.cshtml:

@model MediaImpl
<li class="media">
    Media - @Model.Name - @Model.FileName 
    <a href="#">Remove</a>
</li>

if もループも var もありません。すべてが規則に従って機能します (テンプレートは~/Views/Shared/DisplayTemplatesまたは~/Views/SomeController/DisplayTemplatesフォルダーに配置する必要があり、具体的な型の名前として名前を付ける必要があります - PointImpl.cshtmlMediaImpl.cshtml、 ...)。具象型に基づいて、対応する表示テンプレートがレンダリングされ、これはメイン モデル コレクションの各要素に対して自動的に行われます。

于 2011-06-27T15:36:42.890 に答える