我正在尝试调用 DisplayFor 和 DisplayForModel 从视图中迭代具有各种元素类型的 IEnumerable<>。我为每个元素/模型类型定义了模板。
我想做的是从模板中检查 ViewData.ModelMetadata.ContainerType ,以便模板可以确定它是否作为集合的一部分被调用。
一个简单的例子:
Index1.aspx:用于渲染 Foos 的集合。
<%@ Page Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<IEnumerable<Foo>>" %>
<asp:Content ContentPlaceHolderID="MainPlaceHolder" runat="server">
<ul><%:Html.DisplayForModel()%></ul>
</asp:Content>
Index2.aspx:从 Bar 渲染一个 Foo。
<%@ Page Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<Bar>" %>
<asp:Content ContentPlaceHolderID="MainPlaceHolder" runat="server">
<%:Html.DisplayFor(m => m.Foo)%>
</asp:Content>
Shared\DisplayTemplates\Foo.ascx:Foo 的上下文感知模板。
<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<Foo>" %>
<% var tag = typeof(IEnumerable).IsAssignableFrom(ViewData.ModelMetaData.ContainerType) ? "li" : "div";
%> <<%:tag%>><%:Model.Name%></<%:tag%>>
此示例的问题是通过 Index1.aspx 解析时,模板中的 ViewData.ModelMetaData.ContainerType 为空。从我在Brad Wilson 的帖子和其他人的文章中读到的内容,它与 IEnumerable 的使用及其作为接口有关。
有没有办法确保 ContainerType 已设置?也许通过创建 ModelMetadataProvider?我简短地调查了一下,但似乎 ContainerType 值是在之前确定的,然后传递给了提供者。
任何建议,将不胜感激。