我有以下模型:
class User
{
[Display(Name = "Display Name")]
public string Name { get; set; }
}
在标准 Razor 中,我会执行类似以下操作来获取“显示名称”:
<label asp-for="Model.Name"></label>
但这似乎在 Blazor 中不起作用。有谁知道如何在不使用反射的情况下获取 Blazor 页面中的显示名称?
最佳答案
我的实现是替换常规 Razor 中的 Html.DisplayNameFor()
方法;
@using System.Reflection
@using System.Linq.Expressions;
@using System.ComponentModel.DataAnnotations;
@typeparam T
@if (ChildContent == null)
{
<label>@label</label>
}
else
{
<label>
@label
@ChildContent
</label>
}
@code {
[Parameter] public Expression<Func<T>> For { get; set; }
[Parameter] public RenderFragment ChildContent { get; set; }
private string label => GetDisplayName();
private string GetDisplayName()
{
var expression = (MemberExpression)For.Body;
var value = expression.Member.GetCustomAttribute(typeof(DisplayAttribute)) as DisplayAttribute;
return value?.Name ?? expression.Member.Name ?? "";
}
}
在调用站点使用此功能,可以:
<DisplayName For="@(() => object.Member)" />
或
<DisplayName For="@(() => object.Member)">
<InputText @bind-Value="object.Member" />
</DisplayName>
编辑:澄清一下,两个版本产生的标记略有不同。第一个会产生:
<label>Generated DisplayName</label>
第二个会产生
<label>
Generated DisplayName
<input value="WhateverTheValueIs" />
</label>
此外,在我的实现中,我添加了一个 bool
属性以允许仅纯文本输出 - 因为事实证明,很多时候我只想输出显示名称文本。
关于c# - 如何将 "Display Name"放入 Blazor 页面的标签中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57202354/