web-dev-qa-db-fra.com

Accéder à l'attribut displayName à partir du modèle dans la vue MVC

Si mon modèle a

[DisplayName("First Name")]
public string firstName { get; set; }

Ensuite, je peux l’imprimer dans la vue avec LabelFor.

@Html.LabelFor(model => model.acc_first)

Il sera ensuite rendu comme

<label for="firstName">First Name</label>
  • Mais comment puis-je "raw" lire les attributs de propriété (Prénom) dans la vue? Si, par exemple, je veux envoyer la valeur à une fonction de la page Afficher
27
Joakim
@Html.DisplayNameFor(x => x.acc_first)
41
Darren Oster

Pour accéder aux attributs, vous aurez besoin d'un assistant Html personnalisé. Comme les attributs ne font pas vraiment partie de la propriété ou du modèle, vous devez les contourner pour les accéder. 

public static IHtmlString DisplayName<TModel, TValue>(
                             this HtmlHelper<TModel> html,
                             Expression<Func<TModel, TValue>> expression) {
    var metadata = ModelMetadata.FromLambdaExpression<TModel, TValue>(expression, html.ViewData);

    return new HtmlString(metadata.DisplayName);
}

Pour les attributs supplémentaires qui ne font pas partie des DataAnnotations, vous pouvez effectuer les opérations suivantes:

Créer un attribut personnalisé

public class TooltipAttribute : Attribute, IMetadataAware {
    public TooltipAttribute(string tooltip) {
        this.Tooltip = tooltip;
    }

    public string Tooltip { get; set; }

    public void OnMetadataCreated(ModelMetadata metadata) {
        metadata.AdditionalValues["Tooltip"] = this.Tooltip;
    }
}

La magie se produit dans l'implémentation OnMetadataCreated. Ici, nous pouvons renseigner les AdditionalValues ​​avec tout ce dont nous avons besoin pour notre attribut particulier. Dans ce cas, nous ajoutons une clé d’info-bulle. Votre nom doit être unique, car les autres attributs ou les fournisseurs peuvent ajouter leurs propres clés avec le même nom. Il est important de noter que les attributs ne sont pas toujours lus dans le même ordre. Ainsi, votre attribut d’info-bulle peut être appelé en premier, en dernier ou quelque part au milieu. Cette distinction est importante car elle peut provoquer des effets indésirables.

Puis créez un assistant d'attribut personnalisé

public static IHtmlString TooltipFor<TModel, TValue>(
                             this HtmlHelper<TModel> html,
                             Expression<Func<TModel, TValue>> expression) {
    var metadata = ModelMetadata.FromLambdaExpression<TModel, TValue>(expression, html.ViewData);
    if (metadata.AdditionalValues.ContainsKey("Tooltip"))
        return new HtmlString((string)metadata.AdditionalValues["Tooltip"]);

    return new HtmlString("");
}
13
Buildstarted

Vous pouvez accéder à la valeur de l'attribut Display(Name="...") en 4 étapes:

var type = typeof(YourNamespace.Models.YourModelName);
var memInfo = type.GetMember("firstName"); // your member
var attributes = memInfo[0].GetCustomAttributes(typeof(System.ComponentModel.DataAnnotations.DisplayAttribute), false);
var displayname = ((System.ComponentModel.DataAnnotations.DisplayAttribute)attributes[0]).Name;

Alors displayname aura la valeur First Name dans votre contexte.

5
outofmind

S'appuyant sur la réponse de Darren Oster:

@Html.DisplayNameFor(x => x.acc_first)

Voici un lien vers la documentation: https://msdn.Microsoft.com/en-us/library/system.web.mvc.html.displaynameextensions.displaynamefor(v=vs.118).aspx

Vous pouvez utiliser ceci dans votre code de vue comme ceci:

@{ 
    var foo = Html.DisplayNameFor(x => x.acc_first);

    // call function
    DoStuff(foo);
}
3
bvpb

vous devriez simplement utiliser

[Display(Name = "First Name")]


 public string name{ get; set; }
0
Manish Singh