加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

asp.net-mvc – ASP.Net MVC:Html.Display()用于Collection中的

发布时间:2020-12-16 06:36:36 所属栏目:asp.Net 来源:网络整理
导读:使用适当的视图模板绘制项目的标准MVC示例是: Html.DisplayFor(m = m.Date) 如果Model对象具有名为Date of DateTime的属性,则返回带有Display / DateTime.ascx模板中的HTML的字符串. 假设您想要执行相同的操作,但无法使用强类型版本 – 您在编译时不知道此V
使用适当的视图模板绘制项目的标准MVC示例是:

Html.DisplayFor(m => m.Date)

如果Model对象具有名为Date of DateTime的属性,则返回带有Display / DateTime.ascx模板中的HTML的字符串.

假设您想要执行相同的操作,但无法使用强类型版本 – 您在编译时不知道此View的Model类型.你使用旧的:

Html.Display( “日期”);

所以这是困难的部分.

假设模型是IEnumerable.您不知道这些对象在编译时是什么,但在运行时它们恰好是Date类型为Date的对象,如:

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”),它会检查Model,这是一个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的输出可以采用任何Model,但在本例中是上面3个这些ModelClass对象的列表,将是:

2001年11月10日
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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读