Rob*_*ett 2 c# razor display-templates asp.net-mvc-3
我有一个基本类型的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>
Run Code Online (Sandbox Code Playgroud)
我可能会在稍后添加另一种类型,所以下面的解决方案并不是我真正想要的.
@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
*/
}
Run Code Online (Sandbox Code Playgroud)
我已经看过模型元数据模板提示,但这并没有真正帮助,因为我的模型是一个IEnumerable ..
我正在考虑一个自定义Html Helper查看具体类型的属性但是认为可能有内置的方法来做这个?
而不是foreach简单地使用显示模板:
@model IEnumerable<SomeBaseViewModel>
<ul>
@Html.DisplayForModel()
</ul>
Run Code Online (Sandbox Code Playgroud)
然后为所有子类型定义显示模板.例如:
~/Views/Shared/DisplayTemplates/PointImpl.cshtml:
@model PointImpl
<li class="points">
Points - @Model.Name - @Model.Points points
<a href="#">Remove</a>
</li>
Run Code Online (Sandbox Code Playgroud)
并且~/Views/Shared/DisplayTemplates/MediaImpl.cshtml:
@model MediaImpl
<li class="media">
Media - @Model.Name - @Model.FileName
<a href="#">Remove</a>
</li>
Run Code Online (Sandbox Code Playgroud)
看,没有更多的ifs,没有更多的循环,没有更多的变量.一切工作按照惯例(模板必须位于~/Views/Shared/DisplayTemplates或~/Views/SomeController/DisplayTemplates文件夹,并应被命名为具体类型的名字- PointImpl.cshtml,MediaImpl.cshtml...).根据具体类型,将呈现相应的显示模板,并自动为主模型集合的每个元素.