Asp.net mvc ASP.NET MVC2:能否从集合中获取ModelMetadata.ContainerType?
我试图调用DisplayFor和DisplayForModel,从视图中迭代具有各种元素类型的IEnumerable。我为每个元素/模型类型定义了模板 我要做的是从模板中检查ViewData.ModelMetadata.ContainerType,以便模板可以确定它是否作为集合的一部分被调用 一个简单的例子: Index1.aspx:呈现一组FOOAsp.net mvc ASP.NET MVC2:能否从集合中获取ModelMetadata.ContainerType?,asp.net-mvc,templates,collections,asp.net-mvc-2,modelmetadata,Asp.net Mvc,Templates,Collections,Asp.net Mvc 2,Modelmetadata,我试图调用DisplayFor和DisplayForModel,从视图中迭代具有各种元素类型的IEnumerable。我为每个元素/模型类型定义了模板 我要做的是从模板中检查ViewData.ModelMetadata.ContainerType,以便模板可以确定它是否作为集合的一部分被调用 一个简单的例子: Index1.aspx:呈现一组FOO <%@ Page Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inhe
<%@ 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>
<%@ Page Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<IList<Foo>>" %>
<asp:Content ContentPlaceHolderID="MainPlaceHolder" runat="server">
<%:Html.DisplayForModel("List")%>
</asp:Content>
还有一些与IEnumerable的使用及其作为接口有关
有没有办法确保ContainerType已设置?也许通过创建ModelMetadataProvider?我仔细查看了这个breifly,但看起来ContainerType值是在之前确定的,然后传递给提供者
如果您有任何建议,我们将不胜感激。这是我目前制定的一个功能解决方案,但它有限且有问题,因为它需要将集合转换为模型中的列表,并且模板不支持上下文
Index1.aspx:呈现一组FOO
<%@ 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>
<%@ Page Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<IList<Foo>>" %>
<asp:Content ContentPlaceHolderID="MainPlaceHolder" runat="server">
<%:Html.DisplayForModel("List")%>
</asp:Content>
Shared\DisplayTemplates\List.ascx:特殊集合模板
<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<IList>" %>
<ul class="list">
<% for(int i = 0, count = Model.Count; i < count; i++)
{
%> <li><%:Html.DisplayFor(m => m[i])%></li>
<% }
%>
</ul>
- m[i])%>
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%>>
<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<Foo>" %>
<div><%:Model.Name%></div>
我仍然希望以类似于我之前描述的方式来处理这个场景。因此,模型模板可以自行决定如何格式化输出,而不必创建调用方按名称引用的特殊案例模板