none
Validation en fonction d'un autre contrôle RRS feed

  • Question

  • Bonjour tout le monde,

    Dans un contrôle utilisateur, j'ai une RadioButtonList et un TextBox.

    Pour deux des valeurs de la RadioButtonList, le contenu du TextBox est ignoré. Il est donc exclu d'embêter l'utilisateur parce qu'il n'y a rien dedans.

    Pour la troisième valeur de la RadioButtonList, il est impératif que le TextBox contienne une valeur numérique.

    Or, pour rendre dépendant d'un contrôle l'application ou pas d'un modèle d'expressions régulières à un autre contrôle, a priori je ne vois que la validation personnalisée, donc CustomValidator ?

    Or, quelque chose me gêne dans la doc de ce contrôle :

    Remarque   Si le contrôle d'entrée est vide, aucune fonction de validation n'est appelée et la validation s'effectue correctement. Utilisez un contrôle RequiredFieldValidator pour empêcher l'utilisateur d'omettre un contrôle d'entrée.

    Ah oui c'est bien ce qu'il m'avait semblé. A un détail près : si aucune fonction n'est appelée, la validation ne s'effectue pas correctement. Et un truc du style int intMax = int.Parse(""), ça ne va pas faire joli du tout comme résultat.

    Exit le CustomValidator, alors ?

    Est-ce qu'une fonction côté client peut modifier l'expression régulière appliquée, si je retiens le RegularExpressionValidator ?

    Je ne vais quand même pas m'asseoir sur les contrôles de validation et faire ça moi-même ? D'autant que j'éviterais bien le PostBack tant que la saisie n'est pas bonne, si il faut faire ça sans les contrôles de validation je crains la solution capillotractée ...

    Ou alors, il y a une première approche semi-capillotractée : je mets une fonction onchange sur le TextBox, pour reporter la valeur dans un autre contrôle, non visible, en m'assurant qu'il y ait toujours au moins un caractère dedans, et je pointe le CustomValidator sur cet autre contrôle ?

    mercredi 23 juillet 2014 00:51

Réponses

  • J'ai deux solutions à vous proposer, je garde la meilleure pour la fin.

    Dabord, résoudre le problème tel que posé.

    Selon la doc, le CustomValidator doit être lié à un contrôle qui contient du texte, pour déclencher la fonction de validation. Mais, dans la fonction, on met ce qu'on veut. Le contrôle que le CustomValidator a pour mission de valider n'est donc pas nécessairement celui sur lequel portent les tests.

    Ainsi, il apparaît que la solution la plus simple, tel que présenté, pour effectuer les validations demandées, est d'insérer un autre TextBox, caché, avec du texte, et de lier le CustomValidator à ce TextBox caché. Pas besoin de script pour modifier son contenu : j'ai mis une astérisque au début, il a gardé son astérisque jusqu'à la fin, mais l'astérisque était valide ou pas valide selon les valeurs de la RadioButtonList et du TextBox (celui du départ, où on saisit le maximum de cuisson).

    Attention à ce que les linguistes appellent des faux amis : un contrôle caché à l'utilisateur, ça ne se dit pas Visible="false". Si vous mettez ça dans votre page source ASPX, le contrôle n'aura pas de rendu sur le poste de l'utilisateur, les scripts clients n'y auront donc pas accès, et donc le validateur non plus. Pour avoir un TextBox sur lequel baser le validateur, mais sans qu'il perturbe l'utilisateur en étant visible sur la page, il doit avoir les attributs suivants :

    Visible="true" Style="display:none"

    étant entendu que le style peut être inscrit dans la feuille de style, auquel cas à la place de Style on mettra CssClass, avec le nom du style.

    Visible="true" CssClass="invis"

    A titre de curiosité, ma fonction de validation a cette tête (je rappelle que le tableau radios[] a été initialisé à l'affichage du composant avec les boutons-radios) :

    function ValidateMax(source, arguments)
    {
        alert('Valdation');
        var txb = document.getElementById("ctl00_ContentPlaceHolder1_FormView2_GestCuisson1_txbMaxiCuisson");
        if(radios[1].checked)
        {
            text = txb.value;
            if(text == text.match(/\d{1,4}/g))
            {
                arguments.IsValid = true;
            }
            else
            {
                arguments.IsValid = false;
            }
        }
        else
        {    
            arguments.IsValid = true;
        }
    }

    Avec ça la validation est refusée si le deuxième bouton radio est sélectionné et que le TextBox ne contient pas un nombre, elle est acceptée dans tous les autres cas.

    ça, c'est pour la validation côté client.

    Du côté serveur, j'imagine qu'il me reste à bricoler un peu entre Page.Validate et if(Page.IsValid) dans le code du bouton. Je ne me représente pas a priori que ça pose de gros problèmes techniques.

    Maintenant, le pompon. En peaufinant la mise en page du message d'erreur j'ai parcouru plus attentivement les propriétés du CustomValidator, et j'y ai trouvé :

    ValidateEmptyText : Indique si le validateur valide le contrôle lorsque le texte du contrôle est vide.

    J'imagine que ça se passe de commentaire.




    ______________

    Une petite digression : Internet Explorer propose de diffuser un son (une sorte de clic, après le clic de la souris) lorsqu'on clique sur un lien. Ce son ne retentit pas lorsque la validation échoue : le lien n'est pas réellement suivi. En pareil cas, je verrais bien proposer un autre son. J'imagine que la place de ceci serait plus dans les paramétrages du navigateur que dans le codage du site web ?

    • Marqué comme réponse Gloops mercredi 23 juillet 2014 21:24
    • Modifié Gloops mercredi 23 juillet 2014 21:35
    mercredi 23 juillet 2014 21:11