首页 > 解决方案 > Razor 页面如何找到 DisplayNameFor 中的字段?

问题描述

我很惊讶为什么下表可以正确找到名称。

@model IEnumerable<Member>
<table class="table">
  <thead>
    <tr>
      <th>
        @Html.DisplayNameFor(model => model.LastName)
      </th>
    <tr>
    ...

我设置的模型是Member类型的数组,因此该模型没有属性LastName。列表中的一个元素可以!难道不应该

<th>
  @Html.DisplayNameFor(model => model.First().LastName)
</th>

直到我将视图模型更改为

public class IndexVm
{
  public IEnumerable<Member> Members { get; set; }
}

并试图

<th>
  @Html.DisplayNameFor(model => model.Members.LastName)
</th>

这停止了​​工作,当我进行调查时,我意识到我可以明白为什么。我无法理解它以前是如何工作的,虽然......

  1. 有人可以解释这是怎么回事吗?
  2. 给定我的新视图模型,下面是唯一的选择吗?
  3. 如果列表为空,计算机应该如何知道要显示什么?

    @Html.DisplayNameFor(model => model.Members.FirstOrDefault()?.LastName)

如此迷茫...

标签: c#asp.net-coreviewmodelasp.net-core-2.2

解决方案


显示DisplayNameFor属性的名称或在属性的显示属性中定义的字符串。对于

@Html.DisplayNameFor(model => model.LastName)

,它可以工作,因为在 lambda 表达式中model有一个Membernot的类型。IEnumerable<Member>

你可以使用

@Html.DisplayNameFor(model => model.Members.FirstOrDefault().LastName)

这仍然有效,即使FirstOrDefault()返回 null 因为它在内部使用来自 lambda 表达式的元数据,LastName属性本身未被访问。

如果 Members 是 list IList<Member>,你也可以使用 Members[0]

@Html.DisplayNameFor(model => model.Members[0].LastName)

请参阅此处此处


推荐阅读