web-dev-qa-db-fra.com

Comment obtenir "Nom d'affichage" sur l'étiquette de la page de rasoir de Blazor?

J'ai le modèle suivant:

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

Dans le rasoir standard, je ferais quelque chose comme ça pour obtenir un "nom d'affichage"

<label asp-for="Model.Name"></label>

mais cela ne semble pas fonctionner dans Blazor. Dose quelqu'un sait comment obtenir le nom d'affichage dans la page Blazor sans utiliser de réflexion?

10
user3224222

@ Blackfenix2 je ne suis pas autorisé à commenter (encore ????) mais <Label For="@(() => Model.Name))" /> devrait être <Label For="@(() => Model.Name)" /> -n ')' to Beaucoup

Et pour améliorer quelque peu votre solution, j'ai ajouté @attributes="AdditionalAttributes" Vous pouvez donc le faire (par exemple) <Label class="col-3 col-form-label" For="@(() => Model.Name)" />

@using System.Reflection
@using System.ComponentModel
@using System.Linq.Expressions;

<label @attributes="AdditionalAttributes">@label</label>

@code {
    [Parameter] public Expression<Func<string>> For { get; set; }

    [Parameter(CaptureUnmatchedValues = true)]
    public IDictionary<string, object> AdditionalAttributes { get; set; }

    private string label => GetDisplayName();

    private string GetDisplayName()
    {
        var expression = (MemberExpression)For.Body;
        var value = expression.Member.GetCustomAttribute(typeof(DisplayNameAttribute)) as DisplayNameAttribute;
        return value?.DisplayName ?? expression.Member.Name ?? "";
    }
}
1
Jaap

Ma implation est de remplacer la méthode HTML.DISPLAYNAMEFOR () du rasoir ordinaire;

@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 ?? "";
    }
}

avec cela sur le site d'appel, soit:

<DisplayName For="@(() => object.Member)" />

ou alors

<DisplayName For="@(() => object.Member)">
    <InputText @bind-Value="object.Member" />
</DisplayName>
0
Kruft