web-dev-qa-db-fra.com

A quoi sert la syntaxe @ Html.DisplayFor?

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 n'ai pas la fonction DisplayFor ...

Pourquoi devrais-je écrire:

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

quand je pouvais juste écrire:

@Model.Title
218
Michael Pryor

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

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


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


Exemple:

Si vous créez une vue nommée String.cshtml dans le dossier 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
}

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

211
Bertrand Marron

Je pense que l’avantage principal serait que vous définissiez vos propres modèles d’affichage ou utilisiez des annotations de données.

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

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

et ensuite 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 emails, les urls, etc.

Par exemple, au lieu d’une adresse e-mail étant une simple chaîne, elle pourrait s’afficher sous forme de lien:

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

DisplayFor est é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). C'est utile pour le principe DRY afin que vous n'ayez pas à écrire la même logique d'affichage à plusieurs reprises pour le même modèle.

Consultez ce blog sur les modèles MVC2. C'est toujours très applicable à MVC3:

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


Cela est également utile si votre modèle comporte une annotation de données. Par exemple, si la propriété du modèle est décorée avec l'annotation de données EmailAddress, DisplayFor la restituera sous la forme d'un lien mailto:.

28
vcsjones

Après avoir cherché une réponse par moi-même pendant un certain temps, je pouvais trouver quelque chose. en général, si nous l'utilisons pour une seule propriété, il apparaît même, même si nous faisons un "View Source" de HTML généré. Ci-dessous, un HTML généré, par exemple, lorsque je souhaite afficher uniquement la propriété Name de 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, si je souhaite afficher toutes les propriétés dans une instruction de la classe "Genre" dans ce cas, je peux utiliser @ Html.DisplayFor () pour économiser sur ma saisie, pour le 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.

4
Vikas Sharma