mai 23 2010

[ASP.NET] Désactiver en javascript des Validators et générer dynamiquement des ID uniques pour les ValidationGroups

Category: ASP.NETNicolas Esprit @ 16:33

Ce qui suit a surement déjà du être remonté, mais un rappel ne faisant pas de mal… Récemment j’ai du développer de nouvelles fonctionnalités dans un projet ASP.NET existant. Celui-ci comportait une fiche avec de nombreuses questions à renseigner. Il y avait bien évidemment de nombreux Validators pour valider la saisie de l’utilisateur.

Il a été demandé de cacher des parties de cette fiche en fonction des réponses aux questions. Par exemple si à une question du type “Avez-vous un emprunt bancaire en cours ?” la réponse est non alors on ne doit pas voir le bloc de questions qui concerne cette emprunt (montant restant à payer, durée, etc.). Il a donc fallu désactiver côté client, les Validators qui concernaient ces blocs cachés. Il est possible de le faire grâce à la fonction ValidatorEnable en Javascript. Ce bout de code par exemple :

IEnumerable<RequiredFieldValidator> lst = from Control r in Controls where r is RequiredFieldValidator select (RequiredFieldValidator)r;

StringBuilder sb = new StringBuilder();
sb.Append("javascript: function disableRequiredFieldValidators(boolEnable) {");
foreach (RequiredFieldValidator r in lst)
    sb.Append(" ValidatorEnable(document.getElementById('" + r.ClientID + "'), boolEnable); ");
sb.Append("} ");

permet d’obtenir après un appel à RegisterClientScriptBlock une fonction Javascript qui offre la possibilité de désactiver tous les RequiredFieldValidators d’une Page.

 

Rendre dynamique la property ValidationGroups

Une autre demande du client concernait la comparaison de plusieurs fiches sur une même Page. Logiquement, la fiche est imbriquée dans un UserControl afin de pouvoir la réutiliser. Cependant, j’ai rencontré un problème : la page n’était plus validée par les Validators lorsqu’il y avait plus d’une fiche dans celle-ci. Après investigation dans le HTML généré la raison saute aux yeux : la propriété ValidationGroup des Validators n’est pas générée dynamiquement. Ainsi, si j’utilise le UserControl de la fiche 3 fois sur la même page, le même ValidationGroup sera utilisé pour ces trois instances du UserControl. La solution : rendre dynamique la property ValidationGroup. Pour ce faire dans mon UserControl j’utilise ceci :

protected string UniqueValidationGroup { get { return ClientID + "_vgNomDuValidationGroup"; } }
<asp:RequiredFieldValidator ID="rqvComment" runat="server" Display="Dynamic" ValidationGroup='<%# UniqueValidationGroup %>'
ControlToValidate="txtComment" ErrorMessage="*" Font-Bold="true" Font-Size="Large"/>

Ainsi, plus de soucis lors de la réutilisation d’un UserControl dans une même page. Au passage, la fonction Javascript disableRequiredFieldValidators devrait aussi être nommée de façon unique, on peut pour cela concaténer le ClientID du UserControl au nom de celle-ci.

Tags: , ,

Commentaires

1.
trackback Nicolas Esprit says:

[ASP.NET] Utiliser le RegularExpressionValidator pour valider la taille d'un texte

[ASP.NET] Utiliser le RegularExpressionValidator pour valider la taille d'un texte

Les commentaires sont clos