c# - Html.DisplayNameFor() 使用动态计算的属性
问题描述
我有一个具有 30 多个属性的类对象
public class Person
{
[Display(Name = "A")]
public string PropertyA { get; set; }
[Display(Name = "B")]
public string PropertyB { get; set; }
[Display(Name = "C")]
public string PropertyC { get; set; }
...
...
[Display(Name = "Z")]
public string PropertyZ { get; set; }
}
在我的视图文件中,我正在动态地遍历属性:
@model Person
<div>
@foreach(var prop in Model.GetType().GetProperties())
{
// logic to decide if the property should be
// included in the output or not
<div>@prop.Name</div>
}
</div>
这将列出所有属性,每个属性都在其自己的div
. 我需要做的是输出Display
每个属性的。类似于 javascript 通过[]
. IE:
<div>@Html.DisplayNameFor(m => m[prop.Name])</div> //does not work
这是我尝试过的:
@foreach(var prop in Model.GetType().GetProperties())
{
<div>@Html.DisplayNameFor(prop.Name)</div> //does not work
}
我的目标是稍后过滤掉视图中不需要的属性,而无需在我决定更改类(通过添加或删除属性)时手动编辑视图。
解决方案
使用 LINQ 识别包含该Display
属性的对象并选择Name
参数值:
@foreach (var prop in Model.GetType().GetProperties())
{
// TODO: logic to decide if the property should be included in the output or not
foreach (var ca in prop.CustomAttributes)
{
var name = ca.NamedArguments.Where(t => t.MemberName.Equals("Name")).Select(x => x.TypedValue.Value).FirstOrDefault().ToString();
<div>@Html.DisplayName(name)</div>
}
}
推荐阅读
- matlab - Matlab 错误 - 'table' 类型的输入参数的未定义函数 'plus'
- angular-material - 如何在Angular Material中并排放置卡片?
- python - 在 lambda 表达式 python 中插入变量值
- javascript - 提供给`Card`的`object`类型的无效prop`className`,应为`string`
- node.js - chai 和 mocha 在错误后显示测试成功
- c++ - 检测多线程 C++ 应用程序中的阻塞调用
- python - Python 多处理不使用可用的核心
- c# - DotNet 3.1 更新后随机类别显示为空
- shell - 在 google cloud shell 中保存文件更改(我正在使用 linux - VM)
- shell - 如何编写 grrovy 脚本以重命名名称以 $ 符号开头的文件夹