2012-10-04 8 views
38

Inizio a lavorare con MVC 4 (motore a vista del rasoio). (Credo che questo possa valere anche per MVC 3 e precedenti). Mi chiedo se ci sia qualche vantaggio nell'usare l'annotazione dei dati DisplayAttribute all'interno di una vista rispetto alla semplice scrittura di una stringa direttamente nell'HTML. Per esempio, se ho avuto il seguente modello:Attributo "Visualizza" annotazioni dati MVC 4

public class Thing 
{ 
    public string WildAndCrazyProperty { get; set; } 
} 

... ci sarebbe alcun beneficio in annotare la proprietà come:

[Display(Name = "Wild and Crazy")] 
    public string WildAndCrazyProperty { get; set; } 

... e avere il mio markup essere:

<html> 
    <body> 
     <div>@Html.DisplayNameFor(modelItem => modelItem.WildAndCrazyProperty)</div> 
     <div>@Html.DisplayFor(modelItem => modelItem.WildAndCrazyProperty)</div> 
    </body> 
</html> 

... rispetto a non avere l'annotazione, e facendo:

<html> 
    <body> 
     <div>Wild and Crazy</div> 
     <div>@Html.DisplayFor(modelItem => modelItem.WildAndCrazyProperty)</div> 
    </body> 
</html> 

La ragione per cui non ho menzionato Html.LabelFor in questo caso è perché i dati della proprietà vengono visualizzati come statici (ad es. testo non modificabile) sulla pagina. I dati non saranno mai modificabili su questa pagina, quindi non è necessario per me utilizzare Html.TextBoxFor entro il secondo <div> e successivamente utilizzare lo Html.LabelFor per associare correttamente un'etichetta a tale casella di testo.

risposta

45

Se due viste differenti condividono lo stesso modello (ad esempio, forse uno è per l'output mobile e uno è regolare), potrebbe essere bello avere la stringa in un unico punto: come metadati sul ViewModel.

Inoltre, se si avesse una versione ereditata del modello che necessitava di una visualizzazione diversa, potrebbe essere utile. Per esempio:

public class BaseViewModel 
{ 
    [Display(Name = "Basic Name")] 
    public virtual string Name { get; set; } 
} 

public class OtherViewModel : BaseViewModel 
{ 
    [Display(Name = "Customized Inherited Name")] 
    public override string Name { get; set; } 
} 

devo ammettere che questo esempio è abbastanza artificioso ...

Quelli sono i migliori argomenti a favore di utilizzare l'attributo che posso venire con. La mia opinione personale è che, per la maggior parte, quel genere di cose è meglio lasciare al markup.

+4

E questo è il modo in cui mi sto appoggiando. Sembra che tu voglia qualcosa che è davvero più di una cosa del tipo di visualizzazione nella parte del codice che fa la visualizzazione effettiva. Dovendo ricompilare il progetto solo per cambiare una intestazione o due sembra inutile. –

+0

Sono completamente d'accordo sul punto di ricompilazione. Mi sento anche se dovessi usare il modello in più viste, i pro di mettere quei dati in un attributo non superano i contro. – eouw0o83hf

+2

Quindi mi piace molto il concetto alla base di questa risposta, tuttavia non funziona per me. La mia classe ereditante non sovrascrive l'attributo 'Display' della classe base. Qualche ragione per cui? – Kehlan

8

Uno dei vantaggi è che è possibile utilizzarlo in più visualizzazioni e avere un testo di etichetta coerente. E 'utilizzato anche da asp.net MVC impalcature per generare il testo etichette e rende più facile per generare testo significativo

[Display(Name = "Wild and Crazy")] 
public string WildAndCrazyProperty { get; set; } 

"Wild and Crazy" si presenta costantemente, ovunque si utilizza la proprietà nell'applicazione.

A volte questo non è flessibile in quanto potresti voler cambiare il testo in qualche vista. In tal caso, sarà necessario utilizzare il markup personalizzato come nel secondo esempio

+0

In questo caso, ho solo una vista, quindi forse è per questo che non ho potuto percepire un beneficio. Nonostante questo beneficio, sembra che si possa avere un numero maggiore di punti di vista che riutilizzano questa stessa proprietà prima che la conseguenza della ricompilazione sia superata dal beneficio. –

13

In aggiunta alle altre risposte, c'è un grande vantaggio nell'usare lo DisplayAttribute quando si desidera localizzare i campi. Puoi cercare il nome in un database di localizzazione usando DisplayAttribute e userà qualsiasi traduzione desideri.

Inoltre, puoi consentire a MVC di generare i modelli per te utilizzando Html.EditorForModel() e genererà l'etichetta corretta per te.

In fin dei conti, tocca a voi. Ma l'MVC è molto "Model-centric", motivo per cui gli attributi dei dati vengono applicati ai modelli, in modo che i metadati esistano in un unico punto. Non è che sia una quantità enorme di digitazione aggiuntiva che devi fare.

+0

Nel mio caso attuale, l'app è solo un front-end di test per un servizio WebAPI. Nessuna localizzazione è necessaria; ma posso vedere il beneficio di un simile comportamento. –

+0

@KennethK. - Ci sono molte cose che potrebbero non avvantaggiarti in questo momento, ma potresti desiderare di averlo fatto in seguito. L'utilizzo di un'architettura a 3 livelli potrebbe non avvantaggiarti ora, ma più tardi ... ti farai schioccare la testa. Il punto è, usalo o no ... è una tua scelta, ma cerca di non implicare che è inutile. –

+0

Se mi sono imbattuto in qualcosa che implicava che la tecnica era inutile, non avevo intenzione di farlo. Come ho già detto, l'app è semplicemente una facciata di un servizio web. Non c'è alcuna possibilità che l'applicazione venga utilizzata al di fuori di questa capacità. Dal momento che l'app consiste di esattamente una vista, non ho potuto vedere il vantaggio. Ora, se stavo progettando un'applicazione pubblica con un pubblico globale, sì, quello che descrivi ha perfettamente senso. È la dimensione di questa particolare applicazione che non ha chiarito perché l'attributo sarebbe utile. –