gpt4 book ai didi

asp.net-mvc - ASP.Net MVC : Html. Display() 用于集合中的对象

转载 作者:行者123 更新时间:2023-12-04 23:31:51 24 4
gpt4 key购买 nike

使用适当的 View 模板绘制项目的标准 MVC 示例是:

Html.DisplayFor(m => m.Date)

如果 Model 对象有一个 DateTime 类型的名为 Date 的属性,这将返回一个字符串,其中包含 Display/DateTime.ascx 模板中的 HTML。

假设你想做同样的事情,但不能使用强类型版本——你在编译时不知道这个 View 的模型类型。您使用较旧的:

Html.Display("日期");

所以这是困难的部分。

假设模型是 IEnumerable。您不知道这些对象在编译时是什么,但在运行时它们碰巧又是 DateTime 类型的对象,例如:

public class ModelClass
{
public DateTime Date { get; set; }
}

现在假设您希望 View 遍历这些对象并渲染每个对象。如果您只关心值(value),您可以这样做:
<%
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?我不只是想获得值(value)——我想把它格式化得像 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") %>

因此,理想情况下,此 View 的输出可以采用任何模型,但在这种情况下,上面这些 ModelClass 对象的 3 个列表将是:

11/10/2001
2002 年 11 月 10 日
11/10/2003

因为代码会找到 DateTime 的 Display PartialView 并为每个适本地呈现它。

那么 - 我如何完成 TODO?

最佳答案

看看 Phil Haack 这篇优秀文章中的模板代码。它似乎与您要查找的内容相近:http://haacked.com/archive/2010/05/05/asp-net-mvc-tabular-display-template.aspx

关于asp.net-mvc - ASP.Net MVC : Html. Display() 用于集合中的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3972669/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com