web-dev-qa-db-fra.com

Attribut displayname vs attribut d'affichage

Quelle est la différence entre l'attribut DisplayName et l'attribut Display dans ASP.NET MVC?

119
Ghooti Farangi

Ils vous donnent tous deux le même résultat, mais la différence essentielle que je vois est que vous ne pouvez pas spécifier un attribut ResourceType dans DisplayName. Pour un exemple dans MVC 2, vous deviez sous-classer l'attribut DisplayName pour fournir des ressources via la localisation. Display attribut (nouveauté dans MVC3 et .NET4) prend en charge la surcharge ResourceType sous forme de propriété "prête à l'emploi".

67
Spock

DisplayName définit le DisplayName dans les métadonnées du modèle. Par exemple:

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

et si vous utilisez à votre avis ce qui suit:

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

cela générerait:

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

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

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

137
Darin Dimitrov

Je pense que les réponses actuelles négligent de souligner les différences importantes et significatives réelles et ce que cela signifie pour l'utilisation envisagée. Bien que les deux puissent fonctionner dans certaines situations, car l'implémenteur a intégré la prise en charge des 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 le System.ComponentModel.DataAnnotations espace de noms dans le System.ComponentModel.DataAnnotations.dll Assemblée
  • peut être utilisé sur les paramètres et les champs
  • vous permet de définir des propriétés supplémentaires comme Description ou ShortName
  • peut être localisé avec des ressources

DisplayNameAttribute

  • DisplayName est dans le System.ComponentModel espace de noms dans System.dll
  • peut être utilisé sur des cours et des événements
  • ne peut pas être localisé avec des ressources

L'assembly et l'espace de noms parlent de l'utilisation prévue et le support de la localisation est le grand coup de pied. DisplayNameAttribute existe depuis .NET 2 et semble avoir été conçu pour nommer les composants et les propriétés du développeur dans la grille de propriétés héritée, et non pour les éléments visibles par les utilisateurs finaux pouvant nécessiter une localisation.

DisplayAttribute a été introduit plus tard dans .NET 4 et semble être spécialement conçu pour étiqueter les membres des classes de données qui seront visibles par l'utilisateur final. Il convient donc mieux aux DTO, aux entités et à d'autres éléments de ce type. Je trouve plutôt malheureux qu'ils l'aient limité, de sorte qu'il ne puisse pas être utilisé pour les cours.

EDIT: On dirait que la dernière source .NET Core autorise également l’utilisation de DisplayAttribute sur des classes.

17
Mike Marynowski

Peut-être que cela est spécifique au noyau .net, j'ai trouvé que DisplayName ne fonctionnerait pas mais Display (Name = ...) le fait. Cela peut sauver à 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)
10
mattpm