Стандартный пример MVC для рисования элемента с соответствующим шаблоном вида:
Html.DisplayFor (m => m.Date)
Если объект Model имеет свойство с именем Dateтипа DateTime, это возвращает строку с HTML из шаблона Display / DateTime.ascx.
Предположим, вы хотели сделать то же самое, но не могли использовать версию со строгим типом - вы не сделализнать тип модели для этого представления во время компиляции.Вы используете более старую версию:
Html.Display ("Date");
Итак, вот сложная часть.
Предположим, что модель IEnumerable.Вы не знаете, что это за объекты во время компиляции, но во время выполнения они снова оказываются объектами с датой типа DateTime, например:
public class ModelClass
{
public DateTime Date { get; set; }
}
Теперь предположим, что вы хотите, чтобы ваш просмотр былпереберите эти объекты и визуализируйте каждый из них.Если бы все, что вас беспокоило, это ценность, которую вы могли бы сделать следующим образом:
<%
StringBuilder sb = new StringBuilder();
foreach(object obj in (IEnumerable<object>)Model)
{
Type type = obj.GetType();
foreach(PropertyInfo prop in type.GetProperties())
{
// TODO: Draw the appropriate Display PartialView/Template instead
sb.AppendLine(prop.GetValue(obj, null).ToString());
}
}
%>
<%= sb.ToString() %>
Я, очевидно, воспользуюсь некоторыми ярлыками, чтобы сфокусировать этот пример.
Вот смысл - как мне выполнить этоТОДО Я написал для себя?Я не просто хочу получить значение - я хочу, чтобы оно было красиво отформатировано как Html.Display («Date»).Но если я просто вызываю Html.Display («Date»), он проверяет Model, которая является IEnumerable, для свойства с именем Date, которое, конечно же, не имеет.Html.Display не принимает объект в качестве аргумента для использования в качестве Модели (например, Html.Display (obj, "Date"), и все классы и методы, которые я могу найти, которые находятся под ними, кажутся внутренними, поэтому я могу 'настроить их напрямую.
Должен быть какой-то простой способ выполнить то, что я пытаюсь сделать, но я не могу найти его.
Просто чтобы убедиться,У меня все понятно - вот пример кода DateTime.ascx:
<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<System.DateTime>" %>
<%= Model.ToString("MM/dd/yyyy") %>
И поэтому, в идеале, вывод из этого представления может принимать любую модель, но в данном случае это список из 3из этих объектов ModelClass, приведенных выше, будет:
11/10/10 2001 11/10/2002 11/10/2003
Поскольку код найдет Display PartialView для DateTime и отобразит его соответствующим образомдля каждого.
Итак - как мне выполнить ТОДО?