[ASP.NET MVC] Nouveautés MVC 3 Part 5 - Meilleur gestion de la génération et du rendu HTML

Publié le 17 février 2011 par Nicolasesprit

Ce billet fait suite à la série sur les nouveautés d'ASP.NET MVC 3 écrit conjointement avec Philippe Viallate. Vous pouvez consulter les précédents billets :

  • [ASP.NET MVC] Nouveautés MVC 3 Part 1 - Améliorations dans Visual Studio 2010
  • [ASP.NET MVC] Nouveautés MVC 3 Part 2 - Améliorations pour la Validation
  • [ASP.NET MVC] Nouveautés MVC 3 Part 3 - Global Action FIlters
  • [ASP.NET MVC] Nouveautés MVC 3 Part 4 - Meilleur support de l'injection de dépendances

Nouvelle classe AdditionalMetadataAttribute

Vous pouvez utiliser la classe AdditionalMetadataAttribute pour remplir le dictionnaire ModelMetadata.AdditionalValues pour une propriété de modèle. Par exemple, supposons qu'on ait un modèle de vue dont certaines propriétés ne doivent être visibles que pour un administrateur. Ce modèle peut être annoté avec le nouvel attribut en utilisant "AdminUniquement" comme clé et "true" comme valeur, comme on peut le voir dans l'exemple ci-dessous :  

public class ProductViewModel {
[AdditionalMetadata("AdminUniquement", true)]
public string Name {get; set;}
}

Cette classe permet donc facilement d'ajouter des attributs accessibles lors du rendu. Charge au développeur d'interpréter ces métadonnées supplémentaires et de les utiliser.

Nouvelle méthode Html.Raw

Par défaut, le moteur Razor encode en HTML toutes les valeurs. Pour pallier à cela, MVC 3 introduit une nouvelle méthode : Html.Raw(). Pour illustrer ceci, supposons qu'on stocke dans une variable string du code HTML et qu'on souhaite l'afficher ensuite. Lors du rendu le code HTML sera interprété. Par exemple le code ci-dessous :

@{
string mvcLink = "<a href=\"http://asp.net/mvc\" title=\"ASP.NET MVC Website\">http://asp.net/mvc</a>";
}
<p>To learn more about ASP.NET MVC visit @mvcLink.</p>
<p>To learn more about ASP.NET MVC visit @Html.Raw(mvcLink)</p>
 

Affichera le résultat ci-dessous. On peut voir que le contenu de la variable "mvcLink" est encodé en HTML, tandis que grâce à l'appel à la nouvelle méthode Html.Raw le contenu de la variable est bien interprété et le contenu de la variable "mvcLink" est rendu sous forme de lien HTML.

 

Changements dans la méthode Html.ValidationMessage

Le framework ASP.NET MVC fournit deux Helpers pour la validation, Html.ValidationMessage et Html.ValidationSummary, qui sont utilisés pour afficher des messages d'erreur lors de la validation. Le Helper Html.ValidationMessage a été modifié avec MVC 3 afin d'afficher désormais le premier message d'erreur utile plutôt que de simplement afficher la première erreur. Durant le binding du modèle, le dictionnaire ModelState peut être alimenté par plusieurs sources avec des messages d'erreur à propos d'une propriété, y compris à partir du modèle lui-même (s'il implémente l'interface IValidatableObject), de la validation des attributs appliqués à la propriété, ainsi que des exceptions rencontrées lors de l'accès à la propriété.

Lorsque la méthode Html.ValidationMessage affiche un message de validation, elle ne prend désormais plus en compte les entrées dans le dictionnaire ModelState qui incluent une exception, parce que ce sont généralement des messages d'erreur qui ne sont pas destinés à l'utilisateur. Au lieu de cela, la méthode recherche le premier message de validation qui n'est pas associé à une exception et affiche ce message. Si aucun message non associé à une exception est trouvé, alors elle prendra le premier message qui vient et affichera le message d'erreur générique associé à l'exception. Bref, cette modification apportée par MVC 3 n'aura pas d'impact dans votre manière de coder, mais d'un point de vue utilisateur elle optimisera l'affichage de message d'erreur User-Friendly.

Modifications apportées aux méthodes des Helpers

Les méthodes des Helpers vous permettent de spécifier en attribut une paire nom/valeur en utilisant un objet anonyme comme on peut le voir ci-dessous :

Html.TextBox("Nom", "Valeur", new {titre = "Titre"})

Cette approche ne vous permet pas d'utiliser des traits d'unions dans le nom des attributs, puisque le trait d'union ne peut être utilisé pour le nom d'une propriété en ASP.NET. Cependant, il faut prendre en compte l'arrivée prochaine d'HTML 5 ! Et cette nouvelle version du langage HTML utilisera beaucoup les traits d'unions pour les propriétés utilisant "data-" comme préfixe. Dans un même temps, les underscores ne peuvent être utilisés dans les noms d'attributs HTML mais sont valides pour les noms de propriétés en ASP.NET. Tentant compte de cela, et pour permettre l'utilisation des traits d'union en prévision de l'arrivée de HTML5, ASP.NET MVC 3 vous permet maintenant de spécifier les attributs à l'aide d'un objet anonyme en utilisant des underscores afin qu'il soit transformés en trait d'union lors du rendu HTML. L'exemple ci-dessous illustre cette modification :

Html.TextBox("Nom", "Valeur", new {data_required = "true"})

Le code ci-dessus verra donc son underscore (sur l'attribut "data_required") transformé en trait d'union lors de l'execution du Helper. Nous aurons donc au final le rendu HTML suivant :

<input data-required="true" id="Nom" name="Nom" type="textbox" value="Valeur" />

A ce sujet, il est recommander de lire ces deux articles sur les différents Helpers Html : partie 1, partie 2.

Surcharge des méthodes LabelFor et LabelForModel

ASP.NET MVC 3 inclus des surcharges des méthodes LabelForModel et LabelFor. Ces nouvelles surcharges vous permettent de spécifier ou remplacer le texte du Label.