Qual é a diferença entre DisplayNameatributo e Displayatributo no ASP.NET MVC?
Qual é a diferença entre DisplayNameatributo e Displayatributo no ASP.NET MVC?
Respostas:
Ambos fornecem os mesmos resultados, mas a principal diferença que vejo é que você não pode especificar um atributo ResourceTypein DisplayName. Por exemplo, no MVC 2, você teve que subclassificar o DisplayNameatributo para fornecer recursos via localização. DisplayO atributo (novo no MVC3 e .NET4) suporta ResourceTypesobrecarga como uma propriedade " pronta para uso".
DisplayNamedefine os DisplayNamemetadados no modelo. Por exemplo:
[DisplayName("foo")]
public string MyProperty { get; set; }
e se você usar em sua exibição o seguinte:
@Html.LabelFor(x => x.MyProperty)
isso geraria:
<label for="MyProperty">foo</label>
Display faz o mesmo, mas também permite definir outras propriedades de metadados, como Nome, Descrição, ...
Brad Wilson tem um bom post sobre esses atributos.
Penso que as respostas atuais estão negligenciando para destacar as diferenças importantes e significativas e o que isso significa para o uso pretendido. Embora eles possam funcionar em determinadas situações porque o implementador criou suporte para ambos, eles têm diferentes cenários de uso. Ambos podem anotar propriedades e métodos, mas aqui estão algumas diferenças importantes:
DisplayAttribute
System.ComponentModel.DataAnnotationsespaço para nome na System.ComponentModel.DataAnnotations.dllmontagemDescriptionouShortNameDisplayNameAttribute
System.ComponentModelespaço para nome emSystem.dllO assembly e o namespace falam sobre o uso pretendido e o suporte à localização é o grande incentivo. DisplayNameAttributeexiste desde o .NET 2 e parece ter se dedicado mais à nomeação de componentes e propriedades de desenvolvedor na grade de propriedades herdadas, não tanto para itens visíveis para os usuários finais que podem precisar de localização e outras coisas.
DisplayAttributefoi introduzido posteriormente no .NET 4 e parece ter sido projetado especificamente para rotular membros de classes de dados que serão visíveis ao usuário final, portanto, é mais adequado para DTOs, entidades e outras coisas desse tipo. Eu acho bastante lamentável que eles tenham limitado, então ele não pode ser usado nas aulas.
EDIT: Parece que a fonte mais recente do .NET Core também DisplayAttributepode ser usada em classes agora.
Talvez isso seja específico do núcleo .net, achei que DisplayName não funcionaria, mas Display (Name = ...) funciona. Isso pode salvar outra pessoa da solução de problemas envolvida :)
//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)