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

Spock
fonte
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.

Darin Dimitrov
fonte
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.

Mike Marynowski
fonte
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)
mattpm
fonte