Я пытаюсь вызвать 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: визуализация 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 в шаблоне имеет значение null, если разрешается через Index1.aspx. Из того, что я прочитал в пост Брэда Уилсона и других, это связано с использованием IEnumerable и его интерфейса.
Есть ли способ убедиться, что установлен тип контейнера? Возможно, создав ModelMetadataProvider? Я кратко рассмотрел это, но кажется, что значение ContainerType определяется до, а затем передается поставщику.
Будем благодарны за любые предложения.