asp.net-mvc – 在MVC 4中获取表头名称的最佳方法
我正在尝试在表格中显示对象列表.我可以迭代每个单独的项目以找到它的值(使用for循环或
DisplayTemplate),但是我如何非常地选择一个来显示整个组的标题.
这是一个简化的例子: 模型: public class ClientViewModel { public int Id { get; set; } public List<ClientDetail> Details { get; set; } } public class ClientDetail { [Display(Name="Client Number")] public int ClientNumber { get; set; } [Display(Name = "Client Forname")] public string Forname { get; set; } [Display(Name = "Client Surname")] public string Surname { get; set; } } 视图 @model MyApp.ViewModel.ClientViewModel @{ var dummyDetail = Model.Details.FirstOrDefault(); } <table> <thead> <tr> <th>@Html.DisplayNameFor(model => dummyDetail.ClientNumber)</th> <th>@Html.DisplayNameFor(model => dummyDetail.Forname)</th> <th>@Html.DisplayNameFor(model => dummyDetail.Surname)</th> </tr> </thead> <tbody> @for (int i = 0; i < Model.Details.Count; i++) { <tr> <td>@Html.DisplayFor(model => model.Details[i].ClientNumber)</td> <td>@Html.DisplayFor(model => model.Details[i].Forname)</td> <td>@Html.DisplayFor(model => model.Details[i].Surname)</td> </tr> } </tbody> </table> 注意:我正在使用var dummyDetail = Model.Details.FirstOrDefault();获取我可以在DisplayNameFor中访问其属性的单个项目. >访问这些标题的最佳方法是什么? 解决方法
问题
由于Thomas pointed out,Chris’s answer在某些情况下有效,但在使用ViewModel时会遇到麻烦,因为嵌套属性不具有相同的自动分辨率.如果您的模型类型是IEnumerable< Type>,则此方法有效,因为DisplayNameFor lambda仍然可以访问模型本身的属性: 但是,如果ClientDetail集合嵌套在ViewModel中,我们无法从集合本身获取项属性: 解决方案 正如DisplayNameFor() From List in Model所指出的,您的解决方案实际上非常好.如果集合为null,这不会导致任何问题,因为传递给DisplayNameFor的lambda永远不会被实际执行.它仅将其用作表达式树来标识对象的类型. 所以以下任何一个都可以正常工作: @Html.DisplayNameFor(model => model.Details[0].ClientNumber) @Html.DisplayNameFor(dummy => Model.Details.FirstOrDefault().ClientNumber) @{ ClientDetail dummyModel = null; } @Html.DisplayNameFor(dummyParam => dummyModel.ClientNumber) 进一步说明 如果我们想看到传递表达式所涉及的一些花哨的步法,只需查看DisplayNameFor上的源代码或DescriptionFor之类的自定义实现.这是一个简化示例,说明当我们使用以下不可能的表达式调用DisplayNameFor时会发生什么: @Html.DisplayNameFor3(model => model.Details[-5].ClientNumber) 请注意我们如何从lambda表达式中的model.Details.get_Item(-5).ClientNumber转到只能识别成员(ClientNumber)而不执行表达式.从那里,我们只使用反射来查找DisplayAttribute并获取其属性,在本例中为Name. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- asp.net-mvc-3 – 是否可以在将razor viewengine发送到客户
- asp.net-mvc-3 – CopyAllFilesToSingleFolderForPackageDe
- asp.net-mvc – 使用ASP.NET MVC设置路由{tenant} / {contr
- .net – 如何从用户控件中引用母版页内容控件?
- asp.net – 我如何找出哪些服务器主机LDAP在我的Windows域上
- asp.net-mvc – 使用自定义值呈现Html.Hidden帮助器
- asp.net-mvc-4 – Web.API和FromBody
- asp.net – 如何在不构建网站的情况下使用MSBuild解析网站引
- .net – 如何序列化邮件?
- ASP.net 2.0版是什么意思?