c# - 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>
这停止了工作,当我进行调查时,我意识到我可以明白为什么。我无法理解它以前是如何工作的,虽然......
- 有人可以解释这是怎么回事吗?
- 给定我的新视图模型,下面是唯一的选择吗?
如果列表为空,计算机应该如何知道要显示什么?
@Html.DisplayNameFor(model => model.Members.FirstOrDefault()?.LastName)
如此迷茫...
解决方案
显示DisplayNameFor
属性的名称或在属性的显示属性中定义的字符串。对于
@Html.DisplayNameFor(model => model.LastName)
,它可以工作,因为在 lambda 表达式中model
有一个Member
not的类型。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)
推荐阅读
- python - 为什么“while True:”之外的“sock.recv(1024)”会返回端口上运行的服务,就像 nmap 一样?
- c++ - C++ 程序在 VS 上运行顺畅,但在 Linux Mint 上运行不畅
- c++ - c++ netplan ubuntu yaml 读取和创建
- ruby - 如何从logstash中的netdata聚合指标?
- c# - 如何获得一组数字的所有组合,这些组合将加起来或仅略超过一组数字?
- jquery - 如何在 jQuery 函数中调用数据样式
- python - 如何使用 pdfrw 库编辑可编辑的 pdf?
- bash - 无法通过 Jenkinsfile 在 Bash 脚本中执行 AWS CLI
- mysql - Mysql LEFT JOIN 在两个参数上,在非常大的表上具有一个精确匹配和一个 LIKE 匹配 - 性能
- unity3d - Unity 2018.3.X 自动完成问题