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

时间:2014-01-28 21:03:22

标签: 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,我不知道它?或者有一个贡献项目,这样做?这一般的方法是什么?重写视图引擎?

1 个答案:

答案 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" });

它将呈现以下内容:

enter image description here