Bienvenue à Blogs CodeS-SourceS Identification | Inscription | Aide

Actualités

  • Blog de Cyril DURAND, passionné de JavaScript, Ajax, ASP.net et tout ce qui touche au developpement Web Client-Side.

    View Cyril Durand's profile on LinkedIn

    hit counters

ASP.net Wizard et validation

Question

J'essaye de vérifier que l'utilisateur a coché une checkbox dans un contrôle wizard. J'ai suivi votre article Verifier une checkbox par un validator - CustomValidator mais ASP.net n'arrive pas à trouver ma checkbox.

Comment faire ?

Réponse

La validation des contrôles dans un wizard n'est malheureusement pas une chose évidente, mais voici quelques éléments d'explication. Ceci est valable pour le CustomValidator mais aussi pour les autres contrôles de validation (RequiredFieldValidator, etc...)

En utilisant un CustomNavigationTemplate :

<asp:TemplatedWizardStep ID="TemplatedWizardStep1" runat="server" Title="Step1"> <ContentTemplate> </ContentTemplate> <CustomNavigationTemplate> <script type="text/javascript" > var validateAcceptCondition = function(source, args){ args.IsValid = $get('<%=TemplatedWizardStep1.CustomNavigationTemplateContainer .FindControl("cbAcceptCondition").ClientID%>').checked; } </script> <asp:CustomValidator ID="cvAcceptCondition" runat="server" ClientValidationFunction="validateAcceptCondition" Text="Vous devez accepter les conditions" ValidationGroup="Condition" /> <asp:CheckBox ID="cbAcceptCondition" runat="server" Text="En cochant cette case, j'accepte les conditions ci-dessus" ValidationGroup="Condition" /> <asp:Button ID="StartNextButton" runat="server" CommandName="MoveNext" Text="Suivant" ValidationGroup="Condition" /> </CustomNavigationTemplate> </asp:TemplatedWizardStep>

En validant le contenu du ContentTemplate :

<asp:TemplatedWizardStep ID="TemplatedWizardStep1" runat="server" Title="Step1"> <ContentTemplate> <script type="text/javascript" > var validateAcceptCondition = function(source, args){ args.IsValid = $get('<%=TemplatedWizardStep1.ContentTemplateContainer .FindControl("cbAcceptCondition").ClientID%>').checked; } </script> <asp:CustomValidator ID="cvAcceptCondition" runat="server" ClientValidationFunction="validateAcceptCondition" Text="Vous devez accepter les conditions" ValidationGroup="Condition" /> <asp:CheckBox ID="cbAcceptCondition" runat="server" Text="En cochant cette case, j'accepte les conditions ci-dessus" ValidationGroup="Condition" /> </ContentTemplate> </asp:TemplatedWizardStep>

Un problème se pose puisqu'il faut définir la propriété ValidationGroup sur le bouton "suivant" automatiquement construit par ASP.net. Pour obtenir l'instance du contrôle, rien de tel que de faire un tour dans Reflector, on voit ainsi que l'ID du bouton créé est StartNextButton dans le container d'ID "StartNavigationTemplateContainerID". Si vous avez choisi un imagebutton alors l'id sera StartNextImageButton et enfin pour un linkbutton StartNextLinkButton. On peut donc récuperer l'instance du contrôle en faisant :

protected void Page_Load(object sender, EventArgs e) { ((Button)wizard1.FindControl("StartNavigationTemplateContainerID$StartNextButton")) .ValidationGroup = "Condition"; }

Si vous essayer de valider dans une étape classique les ID des boutons seront :

StepNavigationTemplateContainerID$StepPreviousButton
StepNavigationTemplateContainerID$StepNextButton
StepNavigationTemplateContainerID$CancelButton

et enfin dans l'étape finale :

FinishNavigationTemplateContainerID$FinishPreviousButton
FinishNavigationTemplateContainerID$FinishButton
FinishNavigationTemplateContainerID$CancelButton

Bien sur il ne faudra pas oublier d'effectuer la validation côté serveur en utilisant Page.Validate(validationGroup) et Page.IsValid.

Explication

Pourquoi ASP.net n'arrive t'il pas à trouver le checkbox est ainsi permettre ce code :

<script type="text/javascript" > var validateAcceptCondition = function(source, args){ args.IsValid = $get('<%=cbAcceptCondition.ClientID%>').checked; } </script>

Cela vient du fait que le contrôle WizardStepBase possède l'attribut ParseChildren avec la valeur true. Cet attribut permet de définir certaines propriétés du contrôle directement dans la partie ASPX  comme c'est le cas pour les propriétés ContentTemplate et CustomNavigationTemplate.

Posted: mercredi 15 août 2007 16:54 par cyril
Ce post vous a plu ? Ajoutez le dans vos favoris pour ne pas perdre de temps à le retrouver le jour où vous en aurez besoin :

Commentaires

fougere a dit :

Salut,

Bon j'ai essayé, trituré le code, ça marche pas avec un CreateUserWizard.

Soit ça vient de moi, soit ça vient du statut particulier du bouton suivant, qui es en fait le bouton CreateUserButton, donc qui n'a peut être rien à voir avec un StartNextButton ou un StepNextButton ...

Je ne sais pas très bien me servir de Reflector donc pas trouvé l'info ... :(

# août 21, 2007 09:07

cyril a dit :

Pour avoir les informations sur les ID tu peux aussi activer la trace, dans la directive de page il te suffit de mettre &lt;% @ Page ... trace="true" %&gt;

Mais normalement il s'agit du meme id, puisque createuserwizard hérite de wizard.

# août 21, 2007 11:50
Les commentaires anonymes sont désactivés

Les 10 derniers blogs postés

- un Pacman en Silverlight 2b2 par Pierrick's Blog le il y a 4 heures et 33 minutes

- Une table -> deux entity types sans colonne discriminante en base, gestion des relations par Matthieu MEZIL le il y a 12 heures et 32 minutes

- ssdl view et TPT par Matthieu MEZIL le 07-05-2008, 02:04

- L'injection SQL n'est PAS un problème QUE pour les développeurs web ! par CoqBlog le 07-05-2008, 01:08

- Un outil pour réaliser des animations WPF basées sur des équations de Bézier par Perspective le 07-04-2008, 21:45

- Sandcastle et CodePlex : le verdict par CoqBlog le 07-04-2008, 20:53

- ssdl view et TPH par Matthieu MEZIL le 07-04-2008, 19:12

- Webcasts sur le Parallel Framework disponibles par Matthieu MEZIL le 07-04-2008, 17:26

- [Silverlight] - Comprendre et Débuter avec Silverlight par Danuz le 07-04-2008, 12:41

- SharePoint : Nouvel article sur l'exportation et Importation de sites SharePoint par Blog Technique de Romelard Fabrice le 07-04-2008, 01:00