gpt4 book ai didi

c# - ASP.NET MVC4,将 View 映射到具有多种具体类型的枚举

转载 作者:行者123 更新时间:2023-11-30 20:00:17 25 4
gpt4 key购买 nike

我经常遇到的一个问题如下:

通常我会从我们的 CMS 中获取一个 IEnumerable,它有多种类型,如下所示:

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

理想情况下,我想将 headerNavigation 传递到一个 View 中,让 MVC 根据模型名称找到相应的 View 。虽然在我看来我可以做这样的事情:

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

// etc...
}

如果我只是通过 return View(Model) 并按照约定完成 View 和类型名称的循环和匹配,那就更好了。这是融入 MVC 而我不知道的吗?或者是否有一个 contrib 项目可以做到这一点?解决这个问题的一般方法是什么?重写 View 引擎?

最佳答案

这可以通过使用 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>

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

@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

关于c# - ASP.NET MVC4,将 View 映射到具有多种具体类型的枚举,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21416768/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com