OVH Cloud OVH Cloud

mystere et gros souci de validation

6 réponses
Avatar
herve
Bonjour,

J'utilise sans problèmes depuis pas mal de temps la validation dans des
formulaires (ascx).
Hors dans une application il y a un UC qui ne me renvoie pas de msg
d'erreurs (si je ne fais par exemple aucune saisie) en utilisant
RequiredFieldValidator alors que les mêmes champs sur d'autres
(formulaires ascx ou sur une page aspx) fonctionnent correctement.

J'y ai passé la matinée, il doit y avoir un truc tout bête qui m'échappe!

Voici le composant simplifié que j'ai recrée ou je fais des tests et je
reproduits le même problème, merci de votre aide.
hervé

------------------------
ASCX:
<%@ Control Language="vb" AutoEventWireup="false"
Codebehind="_saisieLienInternet.ascx.vb"
Inherits="webAppliGen.test.saisieLienInternetPROV"
TargetSchema="http://schemas.microsoft.com/intellisense/ie5" %>

<asp:ValidationSummary headerText="Il y a des erreurs sur la page :"
id="Validationsummary1" runat="server" />

<asp:TextBox id="nom999" runat="server" ></asp:TextBox>
<asp:RequiredFieldValidator ControlToValidate="nom999"
ErrorMessage="L'identificateur d'utilisateur est obligatoire."
ID="rfvnom999" runat="server"></asp:RequiredFieldValidator>

<input type="submit" name="btnEnregistrer" id="btnEnregistrer"
onserverclick="btnEnregistrer_ServerClick" runat="server"
value="Soumettre la requête">

----------------------
code behind:
Namespace test
Public Class saisieLienInternetPROV
Inherits System.Web.UI.UserControl

Protected WithEvents btnEnregistrer As
System.Web.UI.HtmlControls.HtmlInputButton
Protected WithEvents vsForm As
System.Web.UI.WebControls.ValidationSummary
Protected WithEvents Validationsummary1 As
System.Web.UI.WebControls.ValidationSummary
Protected WithEvents nom999 As System.Web.UI.WebControls.TextBox
Protected WithEvents rfvnom999 As
System.Web.UI.WebControls.RequiredFieldValidator

...

Sub btnEnregistrer_ServerClick(ByVal sender As System.Object,
ByVal e As System.EventArgs) Handles btnEnregistrer.ServerClick
If Page.IsValid Then
Response.Write("valide")
Else
Response.Write("NON valide")
End If
End Sub
End Class
End Namespace

6 réponses

Avatar
Zazar
Bonjour,


J'utilise sans problèmes depuis pas mal de temps la validation dans des
formulaires (ascx).
Hors dans une application il y a un UC qui ne me renvoie pas de msg
d'erreurs (si je ne fais par exemple aucune saisie) en utilisant
RequiredFieldValidator alors que les mêmes champs sur d'autres
(formulaires ascx ou sur une page aspx) fonctionnent correctement.

J'y ai passé la matinée, il doit y avoir un truc tout bête qui m'échappe!

Voici le composant simplifié que j'ai recrée ou je fais des tests et je
reproduits le même problème, merci de votre aide.
hervé




(snip)

<input type="submit" name="btnEnregistrer" id="btnEnregistrer"
onserverclick="btnEnregistrer_ServerClick" runat="server"
value="Soumettre la requête">




Utilisez un asp:Button plutôt qu'un input.

(snip)

--
Zazar
Avatar
herve
Zazar a écrit :
Bonjour,


J'utilise sans problèmes depuis pas mal de temps la validation dans des
formulaires (ascx).
Hors dans une application il y a un UC qui ne me renvoie pas de msg
d'erreurs (si je ne fais par exemple aucune saisie) en utilisant
RequiredFieldValidator alors que les mêmes champs sur d'autres
(formulaires ascx ou sur une page aspx) fonctionnent correctement.

J'y ai passé la matinée, il doit y avoir un truc tout bête qui m'échappe!

Voici le composant simplifié que j'ai recrée ou je fais des tests et je
reproduits le même problème, merci de votre aide.
hervé





(snip)


<input type="submit" name="btnEnregistrer" id="btnEnregistrer"
onserverclick="btnEnregistrer_ServerClick" runat="server"
value="Soumettre la requête">





Utilisez un asp:Button plutôt qu'un input.

(snip)

--
Zazar




Bonjour,
Celà ne change rien.
PAr contre, je crois avoir compris d'ou cela vient.
Le seul cas ou cela ne fonctionne pas, "proviendrait" du fait que mon
ascx est inclus dans un autre ascx. Puisque tous les autres cas (pages
aspx ou ascx dans une page aspx fonctionne).

rendu htm:
<input class="normal" name="ucSaisies:ucSaisieLienInternet:nomExpSais"
id="ucSaisies_ucSaisieLienInternet_nomExpSais" maxlength="30" size="30"
type="text">

Par contre je ne vois pas de solution!
a+
hervé
Avatar
Zazar
Bonjour,

PAr contre, je crois avoir compris d'ou cela vient.
Le seul cas ou cela ne fonctionne pas, "proviendrait" du fait que mon
ascx est inclus dans un autre ascx. Puisque tous les autres cas (pages
aspx ou ascx dans une page aspx fonctionne).



Normalement, ça ne pose pas de problème.
Vous chargez dynamiquement les contrôles ou bien la référence est faîte
directement dans les .Aspx/.ascx ?

rendu htm:
<input class="normal" name="ucSaisies:ucSaisieLienInternet:nomExpSais"
id="ucSaisies_ucSaisieLienInternet_nomExpSais" maxlength="30" size="30"
type="text">



Le code correspondant à la validation est-il présent dans le rendu ?

Pouvez-vous poster des bouts de code minimaliste reproduisant l'erreur ?

--
Zazar
Avatar
Zazar
> Je mets plutôt en fichier joints, pour un test plus rapide, et afin de
ne pas oublier le petit truc qui bloque ...
les ascx sont dans un sous-répertoire _ascx par rapport à l'aspx.
Ce qui fonctionne : test-valid.aspx + saisieTous.ascx + _saisieTest.ascx
Ce qui ne fonctionne pas: test-valid.aspx + saisies.ascx +


_saisieTest.ascx

Tout d'abord 2 remarques :
1) Ne préfixez pas vos fichiers concernant le web par _.
2) Essayez de fournir du code qui compile sans modification (là j'ai du
retirer des réfèrences à des fichiers que je n'avais pas)

Sinon, vous avez 2 problèmes :
1) La validation ne se fait pas coté client
2) La validation ne se fait pas coté serveur

Le problème 1 est du au fait que vous avez mis la propriété clienttarget de
votre page à downlevel : dans ce cas le code javascript n'est pas généré.

Le problème 2 est du au fait qu'au moment de la vérification de la validité
de votre page, votre validator est caché (visible = false). En effet, votre
contrôle est caché par défaut, et vous ne le rendez visible que lors du
prerender. De plus, le viewstate étant désactivé, le rendre visible au
moment du render ne le rend pas visible lors de la prochaine requête. Si la
validation marche avec saisieTous.ascx , c'est que vous rendez le contrôle
visible au moment du chargement de la page et donc avant la vérification de
sa validité.

--
Zazar
Avatar
herve
Zazar a écrit :
Je mets plutôt en fichier joints, pour un test plus rapide, et afin de
ne pas oublier le petit truc qui bloque ...
les ascx sont dans un sous-répertoire _ascx par rapport à l'aspx.
Ce qui fonctionne : test-valid.aspx + saisieTous.ascx + _saisieTest.ascx
Ce qui ne fonctionne pas: test-valid.aspx + saisies.ascx +



_saisieTest.ascx

Tout d'abord 2 remarques :
1) Ne préfixez pas vos fichiers concernant le web par _.


Est-ce qu'il y a une raison particulière car celà fait quelques temps
que je préfixe des ascx sans souci particulier !
2) Essayez de fournir du code qui compile sans modification (là j'ai du
retirer des réfèrences à des fichiers que je n'avais pas)


désolé oubli

Sinon, vous avez 2 problèmes :
1) La validation ne se fait pas coté client
2) La validation ne se fait pas coté serveur

Le problème 1 est du au fait que vous avez mis la propriété clienttarget de
votre page à downlevel : dans ce cas le code javascript n'est pas généré.


Oui c'était pour faire fonctionner l'appli chez l'hébergeur (alors
qu'elle fonctionne bien en mode local, "peut-être" du à un pb de
sécurité avec le machine.config ... A résoudre ultérieurement ...

Le problème 2 est du au fait qu'au moment de la vérification de la validité
de votre page, votre validator est caché (visible = false). En effet, votre
contrôle est caché par défaut, et vous ne le rendez visible que lors du
prerender. De plus, le viewstate étant désactivé, le rendre visible au
moment du render ne le rend pas visible lors de la prochaine requête. Si la
validation marche avec saisieTous.ascx , c'est que vous rendez le contrôle
visible au moment du chargement de la page et donc avant la vérification de
sa validité.


Voilà donc la petite différence :-(.
En mettant le code dans le load, celà refonctionne.
Merci
Hervé
PS: J'ai vraiment du mal à répartir correctement mon code dans l'init,
le pre-render et le load. Ya souvent un truc qui cloche ...
Avatar
Zazar
Bonsoir,

> 1) Ne préfixez pas vos fichiers concernant le web par _.
Est-ce qu'il y a une raison particulière car celà fait quelques temps
que je préfixe des ascx sans souci particulier !



C'est simplement que VS.NET ne "voit pas" ces fichiers quand on navigue
parmi les applications web.

PS: J'ai vraiment du mal à répartir correctement mon code dans l'init,
le pre-render et le load. Ya souvent un truc qui cloche ...



Oui c'est assez difficile à faire. J'avoue avoir mis du temps à y arriver
aussi, mais je n'ai toujours pas trouvé de règle générale qui empêcherait de
réflèchir à chaque nouvelle situation. Cependant, si vous comprenez le cycle
de vie d'une page asp.net, et tout ce qui se passe entre 2 requêtes, vous
arriverez sans trop de problèmes à pouvoir répartir votre code de manière
focntionnelle. Aprés pour que ce soit propre et efficace, l'habitude aidera.

--
Zazar