asp.net-mvc – ASP.Net MVC:Html.Display()用于Collection中的
使用适当的视图模板绘制项目的标准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日 因为代码会找到DateTime的Display PartialView并为每个代码适当地渲染它. 那么 – 我如何实现TODO? 解决方法
在Phil Haack的这篇优秀文章中查看模板代码.它似乎接近你正在寻找的东西:
http://haacked.com/archive/2010/05/05/asp-net-mvc-tabular-display-template.aspx
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- asp.net – 使用System.Web.Providers的OptimisticConcurre
- .net – WebApi OData实体集/密钥/导航/密钥支持
- 来自asp.net会员身份验证的userid?
- asp.net – 如何使用数据库实现同步Memcached
- .net – ApiController与ODataController在露出DTO时
- 我需要为ASP.NET 4网站提供额外的XSS安全性吗?
- 在ASP.NET 5 / Core 1.0开发期间使用完整的IIS
- asp.net-mvc – 如何在ActionFilterAttribute ASP MVC 5中为
- asp.net-mvc-3 – ASP.NET MVC 3和App_Code文件夹
- 优化 – 在经典ASP内存泄漏中实现对象缓存