2014-01-28 159 views
2

一個問題,我已經進入了很多如下:ASP.NET MVC4,映射視圖一個枚舉多個具體類型

通常我會有一個IEnumerable從我們的CMS進來,將有多種類型,像這樣:

var headerNavigation = new List<IHeaderNav>() { 
      new TextElement(), 
      new TextElement(), 
      new ImageElement() 
}; 

理想情況下,我想headerNavigation傳遞到一個視圖,且具有MVC找到基於模型的名稱,相應的視圖。雖然我可以做這樣的事情在我看來:

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

    // etc... 
} 

如果我剛過return View(Model)並有按約定進行檢視和類型名稱的循環和匹配這將是更好。這是烘烤到MVC,我不知道嗎?還是有一個這樣做的contrib項目?通常的做法是什麼?重寫視圖引擎?

回答

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