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