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,我不知道它?或者有一个贡献项目,这样做?这一般的方法是什么?重写视图引擎?
这可以使用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)
它将呈现以下内容:
归档时间: |
|
查看次数: |
149 次 |
最近记录: |