使用适当的视图模板绘制项目的标准 MVC 示例是:
Html.DisplayFor(m => m.Date)
如果 Model 对象有一个 DateTime 类型的 Date 属性,这将返回一个带有来自 Display/DateTime.ascx 模板的 HTML 的字符串。
假设你想做同样的事情,但不能使用强类型版本——你在编译时不知道这个视图的模型类型。您使用较旧的:
Html.Display("日期");
所以这是困难的部分。
假设模型是 IEnumerable。您不知道这些对象在编译时是什么,但在运行时它们恰好是 Date 类型为 DateTime 的对象,例如:
public class ModelClass
{
public DateTime Date { get; set; }
}
现在假设您希望您的 View 遍历这些对象并渲染每个对象。如果您只关心您可以这样做的价值:
<%
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() %>
我显然采取了一些捷径来保持这个例子的重点。
重点是——我如何完成我为自己写的 TODO?我不只是想得到这个值——我想让它像 Html.Display("Date") 这样的格式很好。但是,如果我只是调用 Html.Display("Date"),它会检查模型,它是一个 IEnumerable,是否有一个名为 Date 的属性,它当然没有。Html.Display 不将对象作为参数用作模型(例如 Html.Display(obj, "Date"),并且我能找到的所有类和方法都位于下面似乎是内部的,所以我不能t 调整并直接调用它们。
必须有一些简单的方法来完成我正在尝试做的事情,但我似乎找不到它。
只是为了确保我清楚 - 这是 DateTime.ascx 的代码示例:
<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<System.DateTime>" %>
<%= Model.ToString("MM/dd/yyyy") %>
因此,理想情况下,这个视图的输出可以采用任何模型,但在这种情况下,上面这些模型类对象中的 3 个的列表将是:
2001 年 11 月 10 日 2002 年 11 月 10 日 2003 年 11 月 10 日
因为代码会找到 DateTime 的 Display PartialView 并为每个相应地呈现它。
那么 - 我如何完成 TODO?