¿Cuál es la diferencia entre DisplayNameatributo y Displayatributo en ASP.NET MVC?
¿Cuál es la diferencia entre DisplayNameatributo y Displayatributo en ASP.NET MVC?
Respuestas:
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 ".
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.
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
System.ComponentModel.DataAnnotationsespacio de nombres en el System.ComponentModel.DataAnnotations.dllensambladoDescriptionoShortNameDisplayNameAttribute
System.ComponentModelespacio de nombres enSystem.dllEl 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.
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)