attribut displayname vs attribut display

Réponses:

69

Ils vous donnent tous les deux les mêmes résultats, mais la principale différence que je vois est que vous ne pouvez pas spécifier ResourceTyped' DisplayNameattribut in . Pour un exemple dans MVC 2, vous deviez sous-classer l' DisplayNameattribut pour fournir une ressource via la localisation. Displayl'attribut (nouveau dans MVC3 et .NET4) prend en charge la ResourceTypesurcharge en tant que propriété « prête à l'emploi ».

Spock
la source
1
Bon à savoir! Était sur le point d'implémenter un attribut personnalisé pour charger la valeur d'affichage à partir du fichier .resx, puis s'est passé sur cette question. L'attribut d'affichage est la voie à suivre lors du développement d'applications localisées.
Carl Heinrich Hancke
148

DisplayNamedéfinit le DisplayNamedans les métadonnées du modèle. Par exemple:

[DisplayName("foo")]
public string MyProperty { get; set; }

et si vous utilisez dans votre vue ce qui suit:

@Html.LabelFor(x => x.MyProperty)

cela générerait:

<label for="MyProperty">foo</label>

Display fait de même, mais vous permet également de définir d'autres propriétés de métadonnées telles que Nom, Description, ...

Brad Wilson a un joli billet de blog couvrant ces attributs.

Darin Dimitrov
la source
1
+1 - probablement beaucoup plus utile que le mien (maintenant supprimé); trop tôt le matin pour moi :)
Andras Zoltan
J'ai eu des problèmes avec PropertyDescriptor et en utilisant Display (name .. lorsque vous appelez @ descriptor.DisplayName, cela ne fonctionnera qu'avec DisplayName, pas Display (name ..).
eaglei22
24

Je pense que les réponses actuelles négligent de mettre en évidence les différences importantes et significatives réelles et ce que cela signifie pour l'utilisation prévue. Bien qu'ils puissent tous les deux fonctionner dans certaines situations, car l'implémenteur a intégré les deux, ils ont des scénarios d'utilisation différents. Les deux peuvent annoter des propriétés et des méthodes, mais voici quelques différences importantes:

DisplayAttribute

  • défini dans l' System.ComponentModel.DataAnnotationsespace de noms de l' System.ComponentModel.DataAnnotations.dllassembly
  • peut être utilisé sur les paramètres et les champs
  • vous permet de définir des propriétés supplémentaires comme DescriptionouShortName
  • peut être localisé avec des ressources

DisplayNameAttribute

  • DisplayName est dans l' System.ComponentModelespace de noms dansSystem.dll
  • peut être utilisé sur les cours et les événements
  • ne peut pas être localisé avec des ressources

L'assembly et l'espace de noms parlent de l'utilisation prévue et la prise en charge de la localisation est le grand kicker. DisplayNameAttributeexiste depuis .NET 2 et semble avoir été davantage destiné à nommer les composants et propriétés du développeur dans la grille de propriétés héritée, pas tant aux éléments visibles pour les utilisateurs finaux qui peuvent avoir besoin d'une localisation, etc.

DisplayAttributea été introduit plus tard dans .NET 4 et semble être conçu spécifiquement pour étiqueter les membres des classes de données qui seront visibles par l'utilisateur final, il est donc plus approprié pour les DTO, les entités et autres choses de ce genre. Je trouve plutôt malheureux qu'ils l'aient limité afin qu'il ne puisse pas être utilisé sur les cours.

EDIT: On dirait que la dernière source .NET Core permet DisplayAttributedésormais également d'être utilisée sur les classes.

Mike Marynowski
la source
13

C'est peut-être spécifique au noyau .net, j'ai trouvé que DisplayName ne fonctionnerait pas mais Display (Name = ...) le fait. Cela peut éviter à quelqu'un d'autre le dépannage impliqué :)

//using statements
using System;
using System.ComponentModel.DataAnnotations;  //needed for Display annotation
using System.ComponentModel;  //needed for DisplayName annotation

public class Whatever
{
    //Property
    [Display(Name ="Release Date")]
    public DateTime ReleaseDate { get; set; }
}


//cshtml file
@Html.DisplayNameFor(model => model.ReleaseDate)
matpm
la source