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

问题描述 投票:1回答:1

我很惊讶为什么下表正确地找到了名字。

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

在我将viewmodel改为之前,我从未注意到这一点

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-core viewmodel asp.net-core-2.2
1个回答
2
投票

DisplayNameFor显示属性的名称或属性的display属性中定义的字符串

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

,它起作用,因为model在lambda表达式中有一种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

© www.soinside.com 2019 - 2024. All rights reserved.