atributo de nombre de pantalla vs atributo de pantalla

Respuestas:

69

Ambos le dan los mismos resultados, pero la diferencia clave que veo es que no puede especificar un atributo ResourceTypein DisplayName. Para un ejemplo en MVC 2, tenía que subclasificar el DisplayNameatributo para proporcionar recursos a través de la localización. DisplayEl atributo (nuevo en MVC3 y .NET4) admite la ResourceTypesobrecarga como una propiedad " lista para usar ".

Spock
fuente
1
¡Bueno saber! Estaba a punto de implementar un atributo personalizado para cargar el valor de visualización del archivo .resx, luego sucedió con esta pregunta. El atributo de visualización es el camino a seguir cuando se desarrollan aplicaciones localizadas.
Carl Heinrich Hancke
148

DisplayNameestablece los DisplayNamemetadatos en el modelo. Por ejemplo:

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

y si usa en su opinión lo siguiente:

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

generaría:

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

Display hace lo mismo, pero también le permite establecer otras propiedades de metadatos como Nombre, Descripción, ...

Brad Wilson tiene una buena publicación de blog que cubre esos atributos.

Darin Dimitrov
fuente
1
+1: probablemente sea mucho más útil que el mío (ahora eliminado); demasiado temprano en la mañana para mí :)
Andras Zoltan
Tuve problemas con PropertyDescriptor y con Display (name .. al llamar a @ descriptor.DisplayName, solo funcionará con DisplayName, no Display (name ..).
eaglei22
24

Creo que las respuestas actuales no están resaltando las diferencias importantes y significativas reales y lo que eso significa para el uso previsto. Si bien ambos podrían funcionar en ciertas situaciones porque el implementador incorporó soporte para ambos, tienen diferentes escenarios de uso. Ambos pueden anotar propiedades y métodos, pero aquí hay algunas diferencias importantes:

DisplayAttribute

  • definido en el System.ComponentModel.DataAnnotationsespacio de nombres en el System.ComponentModel.DataAnnotations.dllensamblado
  • se puede usar en parámetros y campos
  • le permite establecer propiedades adicionales como DescriptionoShortName
  • puede ser localizado con recursos

DisplayNameAttribute

  • DisplayName está en el System.ComponentModelespacio de nombres enSystem.dll
  • se puede usar en clases y eventos
  • no se puede localizar con recursos

El ensamblaje y el espacio de nombres hablan del uso previsto y el soporte de localización es lo mejor. DisplayNameAttributeha existido desde .NET 2 y parece haber sido más destinado a nombrar componentes y propiedades de desarrollador en la cuadrícula de propiedades heredadas, no tanto para cosas visibles para los usuarios finales que pueden necesitar localización y demás.

DisplayAttributese introdujo más tarde en .NET 4 y parece estar diseñado específicamente para etiquetar miembros de clases de datos que serán visibles para el usuario final, por lo que es más adecuado para DTO, entidades y otras cosas de ese tipo. Me parece bastante desafortunado que lo limiten, por lo que no se puede usar en las clases.

EDITAR: Parece que la última fuente de .NET Core también permite DisplayAttributeser utilizada en clases ahora.

Mike Marynowski
fuente
13

Quizás esto sea específico para .net core, descubrí que DisplayName no funcionaría, pero Display (Name = ...) sí. Esto puede salvar a alguien más la solución de problemas involucrada :)

//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)
mattpm
fuente