À quoi sert la syntaxe @ Html.DisplayFor?

223

Je comprends que dans Razor, @Html fait un tas de choses intéressantes, comme générer du HTML pour les liens, les entrées, etc.

Mais je ne reçois pas la fonction DisplayFor ...

Pourquoi devrais-je écrire:

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

quand je pouvais juste écrire:

@Model.Title
Michael Pryor
la source

Réponses:

217

Html.DisplayFor() affichera le DisplayTemplate qui correspond au type de la propriété.

S'il n'en trouve pas, je suppose qu'il invoque .ToString().


Si vous ne connaissez pas les modèles d'affichage, ce sont des vues partielles qui peuvent être placées dans un DisplayTemplatesdossier à l'intérieur du dossier de vue associé à un contrôleur.


Exemple:

Si vous créez une vue nommée String.cshtmldans le DisplayTemplatesdossier de votre dossier de vues (par exemple Home, ou Shared) avec le code suivant:

@model string

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

Ensuite @Html.DisplayFor(model => model.Title)(en supposant qu'il Titles'agit d'une chaîne) utilisera le modèle et affichera <strong>Null string</strong>si la chaîne est nulle ou vide.

Bertrand Marron
la source
6
Il me semble inutile, dans la plupart des cas, d'utiliser DisplayFor pour les types primitifs. Par exemple, DateTime afficherait la date / heure même si la partie heure était inutile. Si vous pouviez spécifier une chaîne de format de "{0: d}" pour un type DateTime dans les attributs de la propriété sur le modèle, DisplayFor pourrait être plus utile.
enorl76
6
@ enorl76 vous pouvez. Voir la réponse de Daveo .
Bertrand Marron
3
Vous pouvez ajouter un sélecteur de date jQuery au modèle EditorFor pour un type de données DateTime pour toujours afficher un sélecteur de date dans les formulaires, par exemple.
Zachary Scott
4
Il me semble que c'est une ingénierie excessive de l'utiliser en général, mais que vous devez l'utiliser lorsque vous souhaitez formater la sortie pour certains attributs de modèle. Question et réponse les gars utiles, merci. + 1 tout au long.
Robin Winslow
que se passe-t-il si vous avez deux modèles du même nom?
halivingston
77

Je pense que le principal avantage serait de définir vos propres modèles d'affichage ou d'utiliser des annotations de données.

Ainsi, par exemple, si votre titre était une date, vous pouvez définir

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

puis sur chaque page, il afficherait la valeur de manière cohérente. Sinon, vous devrez peut-être personnaliser l'affichage sur plusieurs pages. Donc, cela n'aide pas beaucoup pour les chaînes simples, mais cela aide pour les devises, les dates, les e-mails, les URL, etc.

Par exemple, au lieu qu'une adresse e-mail soit une chaîne simple, elle peut apparaître sous forme de lien:

<a href="mailto:@ViewData.Model">@ViewData.TemplateInfo.FormattedModelValue</a>
Daveo
la source
28

DisplayForest également utile pour les modèles. Vous pouvez écrire un modèle pour votre modèle et faire quelque chose comme ceci:

@Html.DisplayFor(m => m)

Similaire à @Html.EditorFor(m => m). Il est utile pour le principal DRY afin que vous n'ayez pas à écrire la même logique d'affichage encore et encore pour le même modèle.

Jetez un œil à ce blog sur les modèles MVC2. Il est toujours très applicable à MVC3:

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


Il est également utile si votre modèle possède une annotation de données. Par exemple, si la propriété du modèle est décorée avec l' EmailAddressannotation de données, elle DisplayForsera rendue sous forme de mailto:lien.

vcsjones
la source
8
@Html.DisplayFor(m => m)peut également être simplifié à juste @Html.DisplayForModel().
Brant Bobby
Quelle est l'expression lamda (m => m)? Quel est le premier m représenter?
Arcadian
1
le premier m est le nom du paramètre
Sinaesthetic
1
@ magic-c0d3r le premier m est l'objet Model de la page. C'est ce qui est utilisé dans l'expression labmda
Don Cheadle
4

Après avoir cherché une réponse pour moi pendant un certain temps, j'ai pu trouver quelque chose. en général, si nous l'utilisons pour une seule propriété, il semble identique même si nous faisons une "Afficher la source" du HTML généré. Ci-dessous est généré du HTML par exemple, lorsque je veux afficher uniquement la propriété Name pour ma classe.

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

Ceci est le code HTML généré à partir du code ci-dessous

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

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

En même temps maintenant, si je veux afficher toutes les propriétés dans une seule instruction pour ma classe "Genre" dans ce cas, je peux utiliser @ Html.DisplayFor () pour économiser sur ma frappe, au moins

je peux écrire @ Html.DisplayFor (modelItem => item.Genre) au lieu d'écrire une déclaration distincte pour chaque propriété de Genre comme ci-dessous

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

et ainsi de suite en fonction du nombre de propriétés.

Vikas Sharma
la source