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 Helper 查看具体类型的属性,但认为可能有一种内置的方式来执行此操作?

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>

看,没有更多的 ifs,没有更多的循环,没有更多的 vars。一切都按约定进行(模板必须位于~/Views/Shared/DisplayTemplatesor~/Views/SomeController/DisplayTemplates文件夹中,并且应命名为具体类型的名称 - PointImpl.cshtml, MediaImpl.cshtml, ...)。根据具体类型,将呈现相应的显示模板,并自动为主模型集合的每个元素呈现。

于 2011-06-27T15:36:42.890 回答