我遇到的一个问题如下:
通常情况下,我的CMS会有一个IEnumerable,它有多种类型,如:
var headerNavigation = new List<IHeaderNav>() {
new TextElement(),
new TextElement(),
new ImageElement()
};
理想情况下,我想将headerNavigation传递给View,让MVC根据模型名称查找相应的视图。虽然我可以在我看来做这样的事情:
foreach (IHeaderNav element in Model)
{
if (sth is TextElement)
{
@{ Html.RenderPartial("TextElement", element); }
}
// etc...
}
如果我只是传递return View(Model)
并且按照约定完成视图和类型名称的循环和匹配,那会更好。这是否融入MVC,我不知道它?或者有一个贡献项目,这样做?这一般的方法是什么?重写视图引擎?
答案 0 :(得分:7)
这可以使用DisplayFor
模板来实现,为每种不同的具体元素类型声明@Model
类型。
作为示例Shared/DisplayTemplates/TextElement.cshtml
:
@Model TextElement
<h3>Text</h3>
<p>model.Text</p>
Shared/DisplayTemplates/ImageElement.cshtml
:
@Model ImageElement
<h3>Image</h3>
<p>model.Text</p>
然后在您的视图中,您需要按如下方式循环集合,使用反射在运行时定位模板:
@foreach(var item in Model.Items)
{
@Html.DisplayFor(x => item, item.GetType().Name)
}
假设Items属性是List<IHeaderNav>()
,并在帖子中发回了以下模型:
model.Items = new List<IHeaderNav>();
model.Items.Add(new TextElement { Text = "Text test" });
model.Items.Add(new ImageElement { Text = "Image test" });
它将呈现以下内容: