Razor页面如何找到DisplayNameFor中的字段?

How can Razor page find the field in DisplayNameFor?

我很惊讶为什么下面的 table 能正确找到名字。

@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.Members.FirstOrDefault()?.LastName)

好迷茫...

DisplayNameFor 显示 属性 的名称或 property.For

的显示属性中定义的字符串
@Html.DisplayNameFor(model => model.LastName)

,因为 model 在 lambda 表达式中的类型是 Member 而不是 IEnumerable<Member>

你可以使用

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

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

如果 Members 是列表 IList<Member>,您也可以使用 Members[0]

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

参考 and here.