ASP.NET MVC4,将视图映射到具有多种具体类型的枚举

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()
};
Run Code Online (Sandbox Code Playgroud)

理想情况下,我想将headerNavigation传递给View,并让MVC根据模型的名称查找相应的视图.虽然我可以在我看来做这样的事情:

foreach (IHeaderNav element in Model)
{
    if (sth is TextElement)
    {
         @{ Html.RenderPartial("TextElement", element);  }
    }

    // etc...
}
Run Code Online (Sandbox Code Playgroud)

如果我刚刚传递return View(Model)并且按照约定完成视图和类型名称的循环和匹配会更好.这是否融入MVC,我不知道它?或者有一个贡献项目,这样做?这一般的方法是什么?重写视图引擎?

hut*_*oid 7

这可以使用DisplayFor模板来实现,@Model为每种不同的具体元素类型声明类型.

举个例子Shared/DisplayTemplates/TextElement.cshtml:

@Model TextElement
<h3>Text</h3>
<p>model.Text</p>
Run Code Online (Sandbox Code Playgroud)

而且Shared/DisplayTemplates/ImageElement.cshtml:

@Model ImageElement
<h3>Image</h3>
<p>model.Text</p>
Run Code Online (Sandbox Code Playgroud)

然后在您的视图中,您需要按如下方式循环集合,使用反射在运行时定位模板:

@foreach(var item in Model.Items)
{
    @Html.DisplayFor(x => item, item.GetType().Name)
}
Run Code Online (Sandbox Code Playgroud)

假设Items属性是List<IHeaderNav>()在帖子中发回的以下模型:

        model.Items = new List<IHeaderNav>();
        model.Items.Add(new TextElement { Text = "Text test" });
        model.Items.Add(new ImageElement { Text = "Image test" });
Run Code Online (Sandbox Code Playgroud)

它将呈现以下内容:

在此输入图像描述