2011-06-27 51 views
2

我有一个基本类型的IEnumerable作为我的模型。ASP.NET MVC 3:具体实现的输出特定视图

我需要在列表中显示不同的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帮助寻找一个属性具体的类型,但认为可能有内置的方式做到这一点?

回答

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> 

见,没有更多的如果,没有更多的循环,没有更多的增值经销商。一切工作按照惯例(模板必须位于~/Views/Shared/DisplayTemplates~/Views/SomeController/DisplayTemplates文件夹中,应命名为具体类型的名称 - PointImpl.cshtmlMediaImpl.cshtml,...)。基于具体的类型,相应的显示模板将被渲染,并且这将自动为主模型集合的每个元素渲染。

+0

谢谢。奇迹般有效。 –