A cosa serve la sintassi @ Html.DisplayFor?


223

Capisco che in Razor, @Html fa un sacco di cose ordinate, come generare HTML per collegamenti, input, ecc.

Ma non ottengo la funzione DisplayFor ...

Perché dovrei scrivere:

@Html.DisplayFor(model => model.Title)

quando potrei semplicemente scrivere:

@Model.Title

Risposte:


217

Html.DisplayFor() visualizzerà DisplayTemplate che corrisponde al tipo di proprietà.

Se non ne trova, suppongo che invochi .ToString().


Se non conosci i modelli di visualizzazione, sono viste parziali che possono essere inserite in una DisplayTemplatescartella all'interno della cartella delle viste associata a un controller.


Esempio:

Se si crea una vista denominata String.cshtmlnella DisplayTemplatescartella della cartella delle viste (ad es Home. O Shared) con il seguente codice:

@model string

@if (string.IsNullOrEmpty(Model)) {
   <strong>Null string</strong>
}
else {
   @Model
}

Quindi @Html.DisplayFor(model => model.Title)(supponendo che Titlesia una stringa) utilizzerà il modello e visualizzerà <strong>Null string</strong>se la stringa è nulla o vuota.


6
Mi sembra inutile, nella maggior parte dei casi, usare DisplayFor per tipi primitivi. Ad esempio, DateTime visualizzerà data / ora anche se la parte di tempo era inutile. Se fosse possibile specificare una stringa di formato "{0: d}" per un tipo DateTime negli attributi della proprietà sul modello, DisplayFor potrebbe essere più utile.
enorl76,

6
@ enorl76 puoi. Vedi la risposta di Daveo .
Bertrand Marron,

3
È possibile aggiungere un selettore di date jQuery al modello EditorFor per un tipo di dati DateTime per mostrare sempre un selettore di date nei moduli, ad esempio.
Zachary Scott,

4
Mi sembra che sia troppo ingegneristico usarlo in generale, ma che dovresti usarlo quando vuoi formattare l'output per determinati attributi del modello. Utili domande e risposte ragazzi, grazie. +1 a tutto tondo.
Robin Winslow,

cosa succede se hai due modelli con lo stesso nome?
Halivingston,

77

Penso che il vantaggio principale sarebbe quando definisci i tuoi modelli di visualizzazione o usi le annotazioni dei dati.

Quindi, ad esempio, se il tuo titolo fosse una data, potresti definirlo

[DisplayFormat(DataFormatString = "{0:d}")]

e quindi su ogni pagina visualizzerebbe il valore in modo coerente. Altrimenti potrebbe essere necessario personalizzare la visualizzazione su più pagine. Quindi non aiuta molto per stringhe semplici, ma aiuta per valute, date, e-mail, URL, ecc.

Ad esempio, invece che un indirizzo e-mail sia una stringa semplice, potrebbe essere visualizzato come collegamento:

<a href="mailto:@ViewData.Model">@ViewData.TemplateInfo.FormattedModelValue</a>

28

DisplayForè utile anche per il templating. Puoi scrivere un modello per il tuo modello e fare qualcosa del genere:

@Html.DisplayFor(m => m)

Simile a @Html.EditorFor(m => m). È utile per l'entità DRY in modo da non dover scrivere più volte la stessa logica di visualizzazione per lo stesso modello.

Dai un'occhiata a questo blog sui modelli MVC2. È ancora molto applicabile a MVC3:

http://www.dalsoft.co.uk/blog/index.php/2010/04/26/mvc-2-templates/


È anche utile se il tuo modello ha un'annotazione di dati. Ad esempio, se la proprietà sul modello è decorata con l' EmailAddressannotazione dei dati, DisplayForla renderà come un mailto:collegamento.


8
@Html.DisplayFor(m => m)può anche essere semplificato a solo @Html.DisplayForModel().
Brant Bobby,

Qual è l'espressione lamda (m => m)? Qual è la prima m rappresentano?
Arcadian,

1
la prima m è il nome del parametro
Sinaesthetic

1
@ magic-c0d3r il primo m è l'oggetto Modello della pagina. Questo è ciò che viene usato nell'espressione labmda
Don Cheadle,

4

Dopo aver cercato una risposta per me stesso per qualche tempo, sono riuscito a trovare qualcosa. in generale, se lo stiamo usando per una sola proprietà, appare uguale anche se facciamo una "Visualizza sorgente" di HTML generato Di seguito viene generato HTML ad esempio, quando voglio visualizzare solo la proprietà Name per la mia classe

    <td>
    myClassNameProperty
    </td>
   <td>
    myClassNameProperty, This is direct from Item
    </td>

Questo è il codice HTML generato dal codice sottostante

<td>
@Html.DisplayFor(modelItem=>item.Genre.Name)            
</td>

<td>
@item.Genre.Name, This is direct from Item
</td>

Allo stesso tempo, ora, se voglio visualizzare tutte le proprietà in un'unica istruzione per la mia classe "Genere" in questo caso, posso usare @ Html.DisplayFor () per risparmiare sulla mia digitazione, almeno

posso scrivere @ Html.DisplayFor (modelItem => item.Genre) al posto di scrivere una dichiarazione separata per ogni proprietà di Genere come di seguito

@item.Genre.Name
@item.Genre.Id
@item.Genre.Description

e così via a seconda del numero di proprietà.

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.