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:
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.
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.
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:
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:
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.
@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,Thisis direct fromItem</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,Thisis direct fromItem</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
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
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:
la source
DisplayFor
est également utile pour les modèles. Vous pouvez écrire un modèle pour votre modèle et faire quelque chose comme ceci: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'
EmailAddress
annotation de données, elleDisplayFor
sera rendue sous forme demailto:
lien.la source
@Html.DisplayFor(m => m)
peut également être simplifié à juste@Html.DisplayForModel()
.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.
Ceci est le code HTML généré à partir du code ci-dessous
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
et ainsi de suite en fonction du nombre de propriétés.
la source