我有一个基本类型的 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 查看具体类型上的属性,但认为可能有一种内置的方法可以做到这一点?
而不是丑陋的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>
and: ~/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
or ~/Views/SomeController/DisplayTemplates
文件夹,并应命名为具体类型的名称 -PointImpl.cshtml
, MediaImpl.cshtml
,...)。根据具体类型,将渲染相应的显示模板,并且这会自动针对主模型集合的每个元素进行渲染。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)