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%>>
この例の問題は、ViewData.ModelMetaData.ContainerType が、Index1.aspx で解決されたときにテンプレートで null になることです。Brad Wilson の投稿などで読んだことから、IEnumerable の使用とそれがインターフェイスであることが関係しています。
ContainerType が設定されていることを確認する方法はありますか? おそらく ModelMetadataProvider を作成することでしょうか? 私は簡単に調べましたが、ContainerType の値は以前に決定されてからプロバイダーに渡されたようです。
任意の提案をいただければ幸いです。