0

我正在尝试调用 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 值是在之前确定的,然后传递给了提供者。

任何建议,将不胜感激。

4

1 回答 1

0

这是我现在制定的一个功能性解决方案,但它是有限且有问题的,因为它需要将集合转换为模型中的列表,并且模板不支持上下文。

Index1.aspx:用于渲染 Foos 的集合。

<%@ 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>

Shared\DisplayTemplates\Foo.ascx:Foo 的非上下文感知模板。

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<Foo>" %>
    <div><%:Model.Name%></div>

我仍然希望以类似于我之前描述的方式来处理这种情况。因此,模型模板可以自行确定它应该如何格式化输出,而不必创建调用者按名称引用的特殊情况模板。

于 2010-06-17T22:03:02.650 回答