Problème de validation sur FormView

v.massip Messages postés 48 Date d'inscription mardi 7 octobre 2003 Statut Membre Dernière intervention 9 décembre 2008 - 7 nov. 2007 à 16:04
v.massip Messages postés 48 Date d'inscription mardi 7 octobre 2003 Statut Membre Dernière intervention 9 décembre 2008 - 12 nov. 2007 à 17:00
Bonjour à tous,

Je viens vers vous avec le problème suivant : Je n'arrive pas à réaliser une validation de FormView (en modification) via des Validators.

Je précise.

Ma page concerne l'administration des utilisateurs d'un site. Sur celle-ci se trouvent un MultiView contenant 2 Views.

La première View, affichée par défaut au chargement de la page, contient :
- un SQLDataSource récupérant les données (simple Select sur la base SQL Server 2005)
- un GridView affichant les données et contenant la colonne 'Sélection'
- un Button permettant de basculer vers la View 2 en mode création
- un Button permettant de basculer vers la View 2 en mode modification

La seconde View contient :
- un SQLDataSource permettant d'insérer un nouvel enregistrement dans la base de données, ou de récupérer l'enregistrement sélectionné dans la GridView pour le mettre à jour
- un FormView avec les champs nécessaires et les 2 liens 'Mettre à jour' et 'Annuler', et configuré comme expliqué ci-dessous.

Configuration du FormView :
- Ouverture en mode insertion si clic sur bouton n°1
- Ouverture en mode modification si clic sur bouton n°2

Jusque là, j'ai correctement paramétré les différents éléments de ma page et les différents tests ont été concluants (en gros, ça fonctionne ! ) : l'enregistrement est modifié ou créé, et l'on retourne sur la View n°1 avec la GridView mise à jour et sans sélection.

Je m'attelle donc à la tâche de validation des éléments renseignés dans le formulaire.
J'ai donc rajouté différents contrôles de validation dans le EditItemTemplate du FormView (et je les transposerai après dans le InsertItemTemplate) : 3 RequiredFieldValidator, 2 RegularExpressionValidator, 2 CompareValidator, 1 CustomValidator et 2 ValidationSummary.

Voici ces éléments :
<

asp:RegularExpressionValidator
ID="REV_MAIL1"
runat="server"
ControlToValidate="MAILTextBox" Display="None"
ErrorMessage="L'adresse mail renseignée n'est pas valide"
ValidationExpression="\w+([-+.']\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*" ValidationGroup="VS_EditTemplate_IP"
Visible="False">* L'adresse mail renseignée n'est pas valide
</asp:RegularExpressionValidator>
<asp:RequiredFieldValidator
ID="RFV_MAIL"
runat="server"
ControlToValidate="MAILTextBox" Display="None"
ErrorMessage="Vous devez renseigner une adresse mail"
ValidationGroup="VS_EditTemplate_IP" Visible="False">* Vous devez renseigner une adresse mail
</asp:RequiredFieldValidator>
<asp:RegularExpressionValidator
ID="REV_MAIL2"
runat="server"
ControlToValidate="MAIL2TextBox" Display="None"
ErrorMessage="L'adresse mail renseignée n'est pas valide"
ValidationExpression="\w+([-+.']\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*" ValidationGroup="VS_EditTemplate_IP"
Visible="False">* L'adresse mail renseignée n'est pas valide
</asp:RegularExpressionValidator>
<asp:CompareValidator
ID="CVL_MAIL"
runat="server"
ControlToCompare="MAIL2TextBox" ControlToValidate="MAILTextBox"
Display="None"
ErrorMessage="Les adresses mail ne correspondent pas" ValidationGroup="VS_EditTemplate_IP"
Visible="False">* Les adresses mail ne correspondent pas
</asp:CompareValidator>
<asp:ValidationSummary
ID="VS_IP"
runat="server"
ValidationGroup="VS_EditTemplate_IP"
/>

<asp:RequiredFieldValidator
ID="RFV_IDENTIFIANT"
runat="server"
ControlToValidate="IDENTIFIANTTextBox" Display="None"
ErrorMessage="Vous devez renseigner un identifiant"
ValidationGroup="VS_EditTemplate_IC" Visible="False">* Vous devez renseigner un identifiant
</asp:RequiredFieldValidator>
<asp:CustomValidator
ID="CVL_IDENTIFIANT"
runat="server"
ControlToValidate="IDENTIFIANTTextBox" Display="None"
ErrorMessage="Cet identifiant existe déjà"
OnServerValidate="CVL_IDENTIFIANT_ServerValidate" ValidationGroup="VS_EditTemplate_IC"
Visible="False">* Cet identifiant existe déjà
</asp:CustomValidator>
<asp:RequiredFieldValidator
ID="RFV_MDP"
runat="server"
ControlToValidate="MOT_DE_PASSETextBox" Display="None"
ErrorMessage="Vous devez renseigner un mot de passe"
ValidationGroup="VS_EditTemplate_IC" Visible="False">* Vous devez renseigner un mot de passe
</asp:RequiredFieldValidator>
<asp:CompareValidator
ID="CVL_MDP"
runat="server"
ControlToCompare="MOT_DE_PASSE2TextBox" ControlToValidate="MOT_DE_PASSETextBox"
Display="None"
ErrorMessage="Les mots de passes ne correspondents pas" ValidationGroup="VS_EditTemplate_IC"
Visible="False">* Les mots de passes ne correspondents pas
</asp:CompareValidator>
<asp:ValidationSummary
ID="VS_IC"
runat="server"
ValidationGroup="VS_EditTemplate_IC"
/>

J'ai normalement correctement paramétré ces différents contrôles selon les règles (si j'utilise ces contrôles dans une form simple, cela fonctionne). Précision : le link 'Mettre à jour' à son 'CauseVaildation' à 'True' et son 'ValidationGroup' à 'VS_EditTemplate_IP' pour les premiers tests. Je compte ensuite faire la validation par le code pour valider les 2 groupes.

Cependant, je me retrouve avec le problème suivant : les validations des contrôles se font après l'update SQL, ce qui implique que je suis renvoyé directement sur ma View n°1 ==> Donc, si je mets un champ requis à Null, je me retrouve avec une jolie erreur, malgré la présence des validators.

Pour palier à cela, je me suis mis à modifier la procédure 'FormView_ItemUpdating' afin de forcer la validation par le code avant l'update et ainsi pourvoir stopper l'opération si celle-ci se révèle non valide. Voici mes différents essais :

- ESSAI 1 :
Dim REV
As RegularExpressionValidator

REV = FormView.FindControl(
"REV_MAIL1")

REV.Validate()

If REV.IsValid =
False
Then
e.Cancel =
True
MVW.ActiveViewIndex = 1

Exit
Sub
End
If

- ESSAI 2 :
Me.Validate()
If

Me.IsValid = False 
Then
e.Cancel =
True
MVW.ActiveViewIndex = 1

Exit
Sub
End
If

Dans les 2 cas (et autres variantes : Me.Page.Validate(), ...), la validation forcée ne retournait pas de résultat (valeurs de 'IsValid' par défaut à 'True'), et donc, l'update s'exécutait avant la validation.

En posant un point d'arrêt en mode debug et en changeant manuellement la valeur de 'IsValid' à 'False', l'application n'exécute pas l'update, la view n°2 reste bien affichée et les messages d'alerte s'affichent.

Deuxième possibilité, je modifie la procédure du clic sur le lien 'Mettre à jour', 'UpdateButton_Click' selon les mêmes essais que ci-dessus. Je me retrouve avec le même problème.

Quelqu'un aurait-il une idée sur l'explication de ce problème, et sur la solution à y apporter ?

Merci d'avance pour votre aide !

2 réponses

v.massip Messages postés 48 Date d'inscription mardi 7 octobre 2003 Statut Membre Dernière intervention 9 décembre 2008 2
7 nov. 2007 à 16:12
Précisions sur ma configuration dev :
Windows XP Pro 2002 SP2
Visual Studio 2005 Pro (8.0.50727.42)
Framework .NET 2.0.50727
Langage VB

Précisions sur ma configuration serveur :
Windows Server 2003 Standard SP2
SQL Server 2005
0
v.massip Messages postés 48 Date d'inscription mardi 7 octobre 2003 Statut Membre Dernière intervention 9 décembre 2008 2
12 nov. 2007 à 17:00
Personne n'a d'idées ???
0
Rejoignez-nous