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

标签 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>

我从来没有注意到这一点,直到我将 View 模型更改为

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

并尝试

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

这不再起作用,当我调查时,我意识到我能明白原因。不过,我不明白它以前是如何工作的......

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

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

很困惑...

最佳答案

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

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

,它从model开始工作类型为Member不是IEnumerable<Member>在 lambda 表达式中。

你可以使用

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

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

如果成员在列表中 IList<Member> ,您还可以使用 Members[0]

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

引用herehere .

关于c# - Razor页面如何找到DisplayNameFor中的字段?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54659117/

相关文章:

java - 如何将 Android 按钮的启用属性绑定(bind)到 ViewModel

javascript - 动态项目 View 模型 knockout

android - “ViewModelProviders”已弃用。 Java解决方案?

c# - 从 Windows 服务访问新的 RabbitMQ 消息

c# - 如何压缩 ASP.NET 中的特定页面

c# - Azure Cosmos DB - 检查项目是否不存在,而不向 Application Insights 抛出错误

asp.net - 运行/调试 ASP.NET Core 应用程序的最简单方法

c# - 由于 ERR_HTTP2_INADEQUATE_TRANSPORT_SECURITY,ASP.NET Core 3.0 应用程序无法在 Windows Server 2012 R2 上运行

c# - 如何创建具有相对宽度值的动态 ColumnDefinitions?

c# - ef代码先复杂化级联删除场景