Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc ASP.NET MVC2:能否从集合中获取ModelMetadata.ContainerType?_Asp.net Mvc_Templates_Collections_Asp.net Mvc 2_Modelmetadata - Fatal编程技术网

Asp.net mvc ASP.NET MVC2:能否从集合中获取ModelMetadata.ContainerType?

Asp.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

我试图调用DisplayFor和DisplayForModel,从视图中迭代具有各种元素类型的IEnumerable。我为每个元素/模型类型定义了模板

我要做的是从模板中检查ViewData.ModelMetadata.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>

还有一些与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>

我仍然希望以类似于我之前描述的方式来处理这个场景。因此,模型模板可以自行决定如何格式化输出,而不必创建调用方按名称引用的特殊案例模板