atributo de nombre de visualización frente a atributo de visualización

¿Cuál es la diferencia entre el atributo DisplayName y el atributo Display en ASP.NET MVC?

Ambos te dan los mismos resultados, pero la diferencia clave que veo es que no puedes especificar un ResourceType en el atributo DisplayName . Para un ejemplo en MVC 2, debe subclase el atributo DisplayName para proporcionar recursos a través de la localización. Display atributo de Display (nuevo en MVC3 y .NET4) admite la sobrecarga de ResourceType como una propiedad “lista para usar”.

DisplayName establece DisplayName en los metadatos del modelo. Por ejemplo:

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

y si usa en su vista lo siguiente:

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

generaría:

  

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.

Creo que las respuestas actuales descuidan destacar las diferencias reales importantes y significativas 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 espacio de nombres System.ComponentModel.DataAnnotations en el ensamblado System.ComponentModel.DataAnnotations.dll
  • se puede usar en parámetros y campos
  • le permite establecer propiedades adicionales como Description o ShortName
  • puede ser localizado con recursos

DisplayNameAttribute

  • DisplayName está en el espacio de nombres System.ComponentModel en System.dll
  • puede usarse en clases y eventos
  • no puede ser localizado con recursos

El ensamblado y el espacio de nombres habla sobre el uso previsto y el soporte de localización es el gran estímulo. DisplayNameAttribute ha estado presente desde .NET 2 y parece haber sido más útil para nombrar componentes y propiedades de desarrollador en la grilla de propiedad heredada, no tanto para elementos visibles para los usuarios finales que pueden necesitar localización, etc.

DisplayAttribute se 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 hayan limitado, por lo que no se puede usar en las clases.

EDITAR: Parece que la última fuente .NET Core permite que DisplayAttribute se use también en las clases.

Quizás esto es específico para .net core, encontré que DisplayName no funcionaría, pero Display (Name = …) sí lo hace. Esto puede salvar a alguien más la resolución de problemas involucrados 🙂

 //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) 
    Intereting Posts