我有以下模型:

class User
{
    [Display(Name = "Display Name")]
    public string Name { get; set; }
}

在标准的Razor中,我会做类似的事情以获取“显示名称”
<label asp-for="Model.Name"></label>

但这在Blazor中似乎不起作用。有人知道如何在Blazor页面中获得显示名称而无需使用反射吗?

最佳答案

坏消息:

目前(preview7),它们不是开箱即用的功能。

好消息:

创建您自己的自定义标签组件(当然需要一点点反射)并在其中封装功能非常容易:

@using System.Linq
@using System.Reflection
@using System.ComponentModel.DataAnnotations

@typeparam TItem

<label for="@fortag">@label</label>

@code {
    [Parameter] public string aspfor { get; set; }

    private string label => GetDisplayName(aspfor);

    private string fortag => aspfor;

    private string GetDisplayName(string propertyname)
    {
        MemberInfo myprop = typeof(TItem).GetProperty(propertyname) as MemberInfo;
        var dd = myprop.GetCustomAttribute(typeof(DisplayAttribute)) as DisplayAttribute;
        return dd?.Name ?? "";
    }

}

并在您的.razor页面中使用它:
<CustomLabel TItem="User" aspfor="@nameof(User.Name)"></CustomLabel>

可以使用Expressions或更多类型化的代码(如@issac在其答案中所述)随意进行改进,然后请我们来解释您的经验。

演示:

blazorfiddle上尝试一下。

关于c# - 如何在Blazor Razor 页面的标签上获取 "Display name"?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/57202354/

10-09 05:36