c# - 如何将 "Display Name"放入 Blazor 页面的标签中?

标签 c# razor blazor

我有以下模型:

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/

相关文章:

c# - async/await 对 web 应用有用吗?

c# - LINQ 读取 XML ...与 XDocument

c# - 循环遍历 Razor 中的模型内容

asp.net-mvc - HTML.Label显示电子邮件地址

blazor - 如何在 Blazor 服务器应用程序加载图像时显示加载指示器?

c# - 使用 navlink 时不会触发 Blazor ASP.Net Core(服务器端)中的自定义 URL 重写规则

C# 调试文件夹复制到另一个位置时不运行 exe

c# - ASP.Net Mvc - View 调用可能导致数据检索的函数是否可以接受?

c# - 在 MVC 上使用嵌套模型 3 : How to update a table inside a table?(外键)

c# - Blazor 父组件可以知道它里面有多少个子组件吗?