在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

  • 访问这些标头的最佳方法是什么?
  • 如果集合为null,会中断吗?
  • 我应该用硬编码的纯文本标签替换它们吗?
凯尔·米特

问题

正如Thomas所指出的Chris的答案在某些情况下有效,但在使用ViewModel时会遇到麻烦,因为嵌套的属性无法享受相同的自动分辨率。如果您的模型类型为IEnumerable<Type>则此方法有效,因为DisplayNameFor lambda仍可以访问模型本身的属性:

模型与枚举<模型>

但是,如果ClientDetail集合嵌套在ViewModel中,则无法从集合本身访问item属性:

ViewModel内部的集合

解决方案

DisplayNameFor()在Model中的List中所指出的,您的解决方案实际上是完美的。如果集合为null,这不会引起任何问题,因为传入的lambdaDisplayNameFor从未真正执行过。它仅将其用作识别对象类型的表达式树。

因此,以下任何一项都可以正常工作

@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)

剖析表达式树

请注意,我们从model.Details.get_Item(-5).ClientNumberlambda表达式开始,到ClientNumber无需执行表达式即可仅识别成员()。DisplayAttribute在这种情况下,我们从此处开始使用反射来查找和获取其属性Name

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

C ++:按进程ID,进程句柄和标题名称从进程中获取唯一窗口的窗口句柄的最佳方法

来自分类Dev

MVC 4中数据库方法的最佳实践

来自分类Dev

路由名称在MVC 4中的意义

来自分类Dev

表MVC中的ActionLink

来自分类Dev

通过 RecRef 获取列的标题名称

来自分类Dev

从 DataTable 获取特定的列标题名称

来自分类Dev

获取 tkinter 窗口的标题名称

来自分类Dev

MVC在动态文本框的控制器中获取值的最佳方法

来自分类Dev

在MVC 4中获取相对URL

来自分类Dev

在MVC中,什么是在表行中放置主键的最佳实践

来自分类Dev

如何在MVC 4剃须刀中获取视图名称

来自分类Dev

如何获取用户从中重定向到MVC4中当前操作的操作名称

来自分类Dev

如何在MVC 4剃须刀中获取视图名称

来自分类Dev

Angular MVC4:按名称获取元素

来自分类Dev

在csv中添加标题名称

来自分类Dev

从不同的表中获取数据并在mvc4的View Index中显示

来自分类Dev

Spring MVC:如何在处理程序方法中获取jsp文件的名称

来自分类Dev

使用 Split() 方法从 SQL 表获取数据到 MVC 4 视图

来自分类Dev

在MVC3中,如何获取当前动作名称?

来自分类Dev

在Javascript函数中获取MVC控制器名称

来自分类Dev

在Javascript函数中获取MVC控制器名称

来自分类Dev

从MVC5中的视图获取布局名称

来自分类Dev

在ASP.NET MVC中获取控制器名称

来自分类Dev

在Javascript函数中获取MVC控制器名称

来自分类Dev

在MVC3中,如何获取当前动作名称?

来自分类Dev

从MVC5中的视图获取布局名称

来自分类Dev

mvc设置并在FormsAuthentication中获取ID和名称

来自分类Dev

ASP.NET MVC在Controller中异步实现的最佳方法

来自分类Dev

在MVC4中捆绑的正确方法

Related 相关文章

热门标签

归档