attributo displayname vs attributo display


Risposte:


69

Entrambi si danno gli stessi risultati, ma la differenza fondamentale che vedo è che non è possibile specificare un ResourceTypein DisplayNameattributo. Per un esempio in MVC 2, è stato necessario sottoclassare l' DisplayNameattributo per fornire la risorsa tramite localizzazione. DisplayL'attributo (nuovo in MVC3 e .NET4) supporta il ResourceTypesovraccarico come proprietà " pronta all'uso ".


1
Buono a sapersi! Stava per implementare un attributo personalizzato per caricare il valore di visualizzazione dal file .resx, quindi è successo su questa domanda. L'attributo display è la strada da percorrere quando si sviluppano applicazioni localizzate.
Carl Heinrich Hancke,

148

DisplayNameimposta i DisplayNamemetadati nel modello. Per esempio:

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

e se usi a tuo avviso quanto segue:

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

genererebbe:

<label for="MyProperty">foo</label>

Display fa lo stesso, ma consente anche di impostare altre proprietà dei metadati come Nome, Descrizione, ...

Brad Wilson ha un bel post sul blog che copre questi attributi.


1
+1 - probabilmente molto più utile del mio (ora cancellato); troppo presto per me :)
Andras Zoltan

Ho avuto problemi con PropertyDescriptor e l'utilizzo di Display (nome .. quando si chiama @ descrittore.DisplayName, funzionerà solo utilizzando DisplayName, non Display (nome ..).
eaglei22,

24

Penso che le risposte attuali stiano trascurando per evidenziare le differenze effettive e significative e ciò che ciò significa per l'uso previsto. Sebbene entrambi possano funzionare in determinate situazioni perché l'implementatore ha integrato il supporto per entrambi, hanno diversi scenari di utilizzo. Entrambi possono annotare proprietà e metodi, ma qui ci sono alcune differenze importanti:

DisplayAttribute

  • definito nello System.ComponentModel.DataAnnotationsspazio dei nomi System.ComponentModel.DataAnnotations.dllnell'assieme
  • può essere utilizzato su parametri e campi
  • ti permette di impostare proprietà aggiuntive come DescriptionoShortName
  • può essere localizzato con risorse

DisplayNameAttribute

  • DisplayName è nello System.ComponentModelspazio dei nomi inSystem.dll
  • può essere utilizzato su lezioni ed eventi
  • non può essere localizzato con risorse

L'assembly e lo spazio dei nomi parlano dell'uso previsto e il supporto della localizzazione è il grande kicker. DisplayNameAttributeè in circolazione da .NET 2 e sembra essere stato concepito più per la denominazione dei componenti e delle proprietà degli sviluppatori nella griglia delle proprietà legacy, non tanto per le cose visibili agli utenti finali che potrebbero aver bisogno di localizzazione e simili.

DisplayAttributeè stato introdotto in seguito in .NET 4 e sembra essere progettato specificamente per etichettare i membri delle classi di dati che saranno visibili all'utente finale, quindi è più adatto per DTO, entità e altre cose di quel tipo. Trovo piuttosto sfortunato che lo abbiano limitato, quindi non può essere utilizzato nelle lezioni.

EDIT: Sembra che l'ultima fonte .NET Core consenta DisplayAttributedi essere utilizzata anche nelle classi ora.


13

Forse questo è specifico del core .net, ho scoperto che DisplayName non funzionerebbe, ma Display (Name = ...) funziona. Questo può salvare qualcun altro nella risoluzione dei problemi coinvolti :)

//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)
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.