剃刀页面如何在DisplayNameFor中找到该字段?

时间:2019-02-12 21:45:01

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

我很惊讶下表为何能正确找到名称。

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

好困惑...

1 个答案:

答案 0 :(得分:2)

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

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

,因为在lambda表达式中model的类型为Member而不是IEnumerable<Member>,所以它起作用。

您可以使用

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

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

如果“成员”在列表IList<Member>中,则您也可以使用成员[0]

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

请参阅herehere