242 votes

À quoi sert la syntaxe @Html.DisplayFor ?

Je sais 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 comprends pas la fonction DisplayFor...

Pourquoi j'écrirais :

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

quand je pouvais juste écrire :

@Model.Title

239voto

Bertrand Marron Points 9284

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

S'il ne peut pas en trouver, je suppose qu'il invoque .ToString() .


Si vous ne connaissez pas les modèles d'affichage, il s'agit de vues partielles pouvant être placées dans une DisplayTemplates dans le dossier de la vue associée à un contrôleur.


Exemple :

Si vous créez une vue nommée String.cshtml à l'intérieur de la DisplayTemplates 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
}

Puis @Html.DisplayFor(model => model.Title) (en supposant que Title est une chaîne de caractères) utilisera le modèle et affichera <strong>Null string</strong> si la chaîne est nulle, ou vide.

81voto

Daveo Points 5117

Je pense que le principal avantage serait lorsque vous définissez vos propres modèles d'affichage ou que vous utilisez des annotations de données.

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

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

et ensuite, sur chaque page, il affichera la valeur de manière cohérente. Sinon, vous devrez peut-être personnaliser l'affichage sur plusieurs pages. Il n'est donc pas très utile pour les chaînes de caractères simples, mais il l'est pour les devises, les dates, les courriels, les URL, etc.

Par exemple, au lieu qu'une adresse électronique soit une simple chaîne de caractères, elle pourrait apparaître comme un lien :

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

32voto

vcsjones Points 51910

DisplayFor est également utile pour la création de 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) . C'est utile pour le principe DRY afin de ne pas avoir à écrire la même logique d'affichage encore et encore pour le même modèle.

Jetez un coup d'œ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/


Elle est également utile si votre modèle possède une annotation Data. Par exemple, si la propriété du modèle est décorée avec l'annotation EmailAddress annotation de données, DisplayFor le rendra comme un mailto: lien.

4voto

Vikas Sharma Points 51

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

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

Voici le 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, si je veux afficher toutes les propriétés dans une seule déclaration pour ma classe "Genre" dans ce cas, je peux utiliser @Html.DisplayFor() pour économiser ma frappe, du moins

Je peux écrire @Html.DisplayFor(modelItem=>item.Genre) au lieu d'écrire une déclaration séparée 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.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X