Précédent   Forum des professionnels en informatique > Dotnet > Développement Web > ASP.NET
ASP.NET ASP.NET - Forum d'entraide sur la programmation ASP.NET & Développement Web en C#. Avant de poster -> FAQ ASP.NET, Articles ASP.NET
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
Vieux 30/06/2008, 14h35   #1
Modérateur
 
Avatar de Pongten
 
Inscription: juin 2002
Localisation: Namur
Âge: 30
Messages: 902
Par défaut Contrôle de Validation côté client

Bonjour à tous,

Je suis en train d'essayer d'implémenter un contrôle de validation personnalisé.
J'aimerais que ce contrôle effectue une validation côté client quand cela est possible. Malheureusement, je coince sur un problème pour lequel je n'ai trouvé quasi aucune information (même pas sur MSDN).

Lorsque j'arrive sur ma page, le contrôle déclenche une erreur JavaScript signalant que

Code :
ValidatorHookupControlID is not defined !
(il s'agit de la méthode qui va demander la validation client pour le contrôle lorsqu'il perdra le focus.)

Quelqu'un a-t-il une piste ?

Merci.
__________________
Si ton problème a une solution, rien ne sert de t'inquiéter..
Si il n'en a pas, t'inquiéter ne sert à rien

Ma Page
Pongten est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/06/2008, 15h56   #2
Rédacteur

 
Avatar de nico-pyright(c)
 
Inscription: octobre 2003
Messages: 6 270
tu as un controle de validation sur ta page ?
si non, la ressource js contenant le framework de validation client n'est peut-etre pas chargée

que renvoit
Code :
alert(typeof(Page_Validators));
si c'est "undefined", alors c'est ca

ton validator personnalisé implémente-t-il IValidator (ou hérite de BaseValidator) ?
nico-pyright(c) est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/06/2008, 16h24   #3
Modérateur
 
Avatar de Pongten
 
Inscription: juin 2002
Localisation: Namur
Âge: 30
Messages: 902
Citation:
Envoyé par nico-pyright(c) Voir le message
tu as un controle de validation sur ta page ?
si non, la ressource js contenant le framework de validation client n'est peut-etre pas chargée

que renvoit
Code :
alert(typeof(Page_Validators));
si c'est "undefined", alors c'est ca

ton validator personnalisé implémente-t-il IValidator (ou hérite de BaseValidator) ?
En fait, pour faire simple, il s'agit d'un contrôle qui s'auto-valide. Par exemple, un textbox mais qui implémente l'interface IValidator.

Cependant, alert(typeof(Page_Validators)), placé en StartupScript me renvoie bien undefined
__________________
Si ton problème a une solution, rien ne sert de t'inquiéter..
Si il n'en a pas, t'inquiéter ne sert à rien

Ma Page
Pongten est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/06/2008, 16h41   #4
Rédacteur

 
Avatar de nico-pyright(c)
 
Inscription: octobre 2003
Messages: 6 270
si tu implémentes IValidator, il faut que tu fasses savoir à la page que tu es un validator en t'enregistrant dans la collection de validator :

Code :
Page.Validators.Add(this);
Il faudra également le supprimer à l'unload

Ceci est fait automatiquement en dérivant de BaseValidator
nico-pyright(c) est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/06/2008, 17h01   #5
Modérateur
 
Avatar de Pongten
 
Inscription: juin 2002
Localisation: Namur
Âge: 30
Messages: 902
Arf... J'y ai cru pendant un instant... car j'avais en effet oublier d'ajouter mon contrôle comme contrôle de validation...

Mais cependant l'erreur subsiste...

ValidatorHookupControlID is not defined
__________________
Si ton problème a une solution, rien ne sert de t'inquiéter..
Si il n'en a pas, t'inquiéter ne sert à rien

Ma Page
Pongten est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/06/2008, 17h05   #6
Rédacteur

 
Avatar de nico-pyright(c)
 
Inscription: octobre 2003
Messages: 6 270
si tu utilises firefox et que tu disposes d'un outil comme firebird, tu pourrais savoir si le fichier contenant toutes les fonctions du framework client de validation est présent.

Tu as ca ? Comment ca, on pourrait vérifier si ta page est reconnue comme ayant des validateurs.

Ensuite, tu peux essayer de boucler depuis ta page aspx, genre, dans le OnPreRender, sur la collection de validator, histoire de vérifier qu'il trouve bien le tien

Code :
foreach (BaseValidator validator in Page.Validators)
{
}
 
nico-pyright(c) est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/06/2008, 17h11   #7
Rédacteur

 
Avatar de nico-pyright(c)
 
Inscription: octobre 2003
Messages: 6 270
ah oui, il manque un truc.
Si tu n'hérites pas de BaseValidator, il faut inclure le js à la main je crois.

Un ptit coup de reflector

Et on a un truc du genre :

Code :
    if (!this.Page.IsPartialRenderingSupported)
    {
        if (!this.Page.ClientScript.IsClientScriptBlockRegistered(typeof(BaseValidator), "ValidatorIncludeScript"))
        {
            this.Page.ClientScript.RegisterClientScriptResource(typeof(BaseValidator), "WebUIValidation.js");
            this.Page.ClientScript.RegisterStartupScript(typeof(BaseValidator), "ValidatorIncludeScript", "\r\n<script type=\"text/javascript\">\r\n<!--\r\nvar Page_ValidationActive = false;\r\nif (typeof(ValidatorOnLoad) == \"function\") {\r\n    ValidatorOnLoad();\r\n}\r\n\r\nfunction ValidatorOnSubmit() {\r\n    if (Page_ValidationActive) {\r\n        return ValidatorCommonOnSubmit();\r\n    }\r\n    else {\r\n        return true;\r\n    }\r\n}\r\n// -->\r\n</script>\r\n        ");
            this.Page.ClientScript.RegisterOnSubmitStatement(typeof(BaseValidator), "ValidatorOnSubmit", "if (typeof(ValidatorOnSubmit) == \"function\" && ValidatorOnSubmit() == false) return false;");
        }
    }
    else
    {
        ValidatorCompatibilityHelper.RegisterClientScriptResource(this, typeof(BaseValidator), "WebUIValidation.js");
        ValidatorCompatibilityHelper.RegisterStartupScript(this, typeof(BaseValidator), "ValidatorIncludeScript", "\r\n<script type=\"text/javascript\">\r\n<!--\r\nvar Page_ValidationActive = false;\r\nif (typeof(ValidatorOnLoad) == \"function\") {\r\n    ValidatorOnLoad();\r\n}\r\n\r\nfunction ValidatorOnSubmit() {\r\n    if (Page_ValidationActive) {\r\n        return ValidatorCommonOnSubmit();\r\n    }\r\n    else {\r\n        return true;\r\n    }\r\n}\r\n// -->\r\n</script>\r\n        ", false);
        ValidatorCompatibilityHelper.RegisterOnSubmitStatement(this, typeof(BaseValidator), "ValidatorOnSubmit", "if (typeof(ValidatorOnSubmit) == \"function\" && ValidatorOnSubmit() == false) return false;");
    }
 
nico-pyright(c) est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/06/2008, 17h11   #8
Modérateur
 
Avatar de Pongten
 
Inscription: juin 2002
Localisation: Namur
Âge: 30
Messages: 902
Bon, le problème vient apparemment bien du fait que la page ne charge pas les scripts de validation client.

Par contre pour la boucle dans les contrôles de validation, mon contrôle est bien repris dans la collection....

Je suis sur que ça doit être une bêtise mais ça m'énerve !!

Merci pour ton aide en tout cas
__________________
Si ton problème a une solution, rien ne sert de t'inquiéter..
Si il n'en a pas, t'inquiéter ne sert à rien

Ma Page
Pongten est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/06/2008, 17h23   #9
Rédacteur

 
Avatar de nico-pyright(c)
 
Inscription: octobre 2003
Messages: 6 270
comme on a posté en meme temps, je ne sais pas si tu as vu ma réponse
nico-pyright(c) est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/06/2008, 17h24   #10
Modérateur
 
Avatar de Pongten
 
Inscription: juin 2002
Localisation: Namur
Âge: 30
Messages: 902
Mais comment disposer du WebUIValidation.js ???
__________________
Si ton problème a une solution, rien ne sert de t'inquiéter..
Si il n'en a pas, t'inquiéter ne sert à rien

Ma Page
Pongten est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/06/2008, 17h45   #11
Rédacteur

 
Avatar de nico-pyright(c)
 
Inscription: octobre 2003
Messages: 6 270
comme ca, ca suffit :

Code :
        protected override void OnPreRender(EventArgs e)
        {
            if (!Page.ClientScript.IsClientScriptBlockRegistered(typeof(BaseValidator), "ValidatorIncludeScript"))
            {
                Page.ClientScript.RegisterClientScriptResource(typeof(BaseValidator), "WebUIValidation.js");
                Page.ClientScript.RegisterStartupScript(typeof(BaseValidator), "ValidatorIncludeScript", "\r\n<script type=\"text/javascript\">\r\n<!--\r\nvar Page_ValidationActive = false;\r\nif (typeof(ValidatorOnLoad) == \"function\") {\r\n    ValidatorOnLoad();\r\n}\r\n\r\nfunction ValidatorOnSubmit() {\r\n    if (Page_ValidationActive) {\r\n        return ValidatorCommonOnSubmit();\r\n    }\r\n    else {\r\n        return true;\r\n    }\r\n}\r\n// -->\r\n</script>\r\n        ");
                Page.ClientScript.RegisterOnSubmitStatement(typeof(BaseValidator), "ValidatorOnSubmit", "if (typeof(ValidatorOnSubmit) == \"function\" && ValidatorOnSubmit() == false) return false;");
            }
            base.OnPreRender(e);
        }
C'est un fichier de resource
nico-pyright(c) est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/07/2008, 11h58   #12
Modérateur
 
Avatar de Pongten
 
Inscription: juin 2002
Localisation: Namur
Âge: 30
Messages: 902
Effectivement, cela ne génère plus d'erreur...

Malheureusement cela ne fonctionne quand même pas mais je pense que c'est du à l'architecture du contrôle qui est en fait un compositeControl.

J'y ai dès lors intégré un CustomValidator pour lequel j'intègre la vérification que je souhaite effectuer côté client.

Là où ça coince : la validation s'effectue correctement mais le postback n'est pas annulé en cas de validation client échouée. Je positionne pourtant bien le flag IsValid à false...

Merci pour ton aide en tout cas...
__________________
Si ton problème a une solution, rien ne sert de t'inquiéter..
Si il n'en a pas, t'inquiéter ne sert à rien

Ma Page
Pongten est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/07/2008, 13h56   #13
Rédacteur

 
Avatar de nico-pyright(c)
 
Inscription: octobre 2003
Messages: 6 270
si t'as un projet minimal qui reproduit le problème, je veux bien jeter un coup d'oeil
nico-pyright(c) est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/07/2008, 15h33   #14
Modérateur
 
Avatar de Pongten
 
Inscription: juin 2002
Localisation: Namur
Âge: 30
Messages: 902
Merci pour ton aide Nico...

En tentant de construire un petit projet pour reproduire le problème, je suis tombé sur la source du problème. En fait le bouton qui provoquait le submit n'était pas tout à fait d'origine.

En fait, le bouton en question se désactive via javascript avant de provoquer manuellement un postback (via GetPostBackReference).. ce qui apparemment ne vérifie pas la validité de la page avant de provoquer le postback.

Temporairement, j'ai désactivé cette fonctionnalité et cela fonctionne... je verrai par après si je sais mettre en place une solution similaire.

Merci encore pour t'être penché sur le sujet.
__________________
Si ton problème a une solution, rien ne sert de t'inquiéter..
Si il n'en a pas, t'inquiéter ne sert à rien

Ma Page
Pongten est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 09h25.


Vos questions techniques : forum d'entraide C# - Publiez vos articles, tutoriels et cours
et rejoignez-nous dans l'équipe de rédaction du club d'entraide des développeurs francophones
Nous contacter - Hébergement - Participez - Copyright © 2000-2010 www.developpez.com - Legal informations.