chu*_*nce 2 c# asp.net asp.net-mvc asp.net-mvc-3 asp.net-mvc-4
我遇到的一个问题如下:
通常我会从我们的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,我不知道它?或者有一个贡献项目,这样做?这一般的方法是什么?重写视图引擎?
这可以使用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" });
它将呈现以下内容:

| 归档时间: | 
 | 
| 查看次数: | 149 次 | 
| 最近记录: |