atributo displayname vs atributo display


Respostas:


69

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".


1
Bom saber! Estava prestes a implementar um atributo personalizado para carregar o valor de exibição do arquivo .resx, e aconteceu nesta questão. O atributo de exibição é o caminho a seguir ao desenvolver aplicativos localizados.
Carl Heinrich Hancke

148

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.


1
+1 - provavelmente muito mais útil que o meu (agora excluído); muito cedo pela manhã para me :)
Andras Zoltan

Eu tive problemas com PropertyDescriptor e usando Display (nome .. quando chamado @ descriptor.DisplayName, ele só irá funcionar usando DisplayName, não Mostrar (nome ..).
eaglei22

24

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

  • definido no System.ComponentModel.DataAnnotationsespaço para nome na System.ComponentModel.DataAnnotations.dllmontagem
  • pode ser usado em parâmetros e campos
  • permite definir propriedades adicionais como DescriptionouShortName
  • pode ser localizado com recursos

DisplayNameAttribute

  • DisplayName está no System.ComponentModelespaço para nome emSystem.dll
  • pode ser usado em aulas e eventos
  • não pode ser localizado com recursos

O 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.


13

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)
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.