IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

ASP.NET Discussion :

Désactivation d'un bouton entre clic et doPostBack (en .NET 1.1)


Sujet :

ASP.NET

  1. #1
    Membre confirmé Avatar de Vonziz
    Inscrit en
    Décembre 2006
    Messages
    215
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 215
    Par défaut Désactivation d'un bouton entre clic et doPostBack (en .NET 1.1)
    Bonjour,

    Ma question est simple : comment désactiver un bouton suite à son appui dans un formulaire aspx en .NET 1.1?

    Concrètement, j'ai des utilisateurs sur mon application qui bourrine l'appui de ce bouton (car il y a des latences serveur dû à un envoi de mail juste après appui) et ce bourrinage d'appui sur bouton provoque des incohérences en base (dû à de multiples envois de requêtes identiques sur le SGBD).

    Merci d'avance pour vos réponses et désolé si la question a déjà été posée!

  2. #2
    Membre Expert
    Avatar de Pongten
    Homme Profil pro
    IT Analyst & Software Developer
    Inscrit en
    Juin 2002
    Messages
    1 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : IT Analyst & Software Developer
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 173
    Par défaut
    Tu peux le désactiver via Javascript...

    Un petit OnClientClick="this.disabled = true"...

  3. #3
    Membre confirmé Avatar de Vonziz
    Inscrit en
    Décembre 2006
    Messages
    215
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 215
    Par défaut
    Ca ne marche pas.

    Je l'ajoute dans les attributs du asp:button dans le code HTML résultant de l'éditeur graphique de VS et rien ne se passe à l'exécution.

    Quelqu'un aurait-il une autre idée?

  4. #4
    Membre Expert
    Avatar de Pongten
    Homme Profil pro
    IT Analyst & Software Developer
    Inscrit en
    Juin 2002
    Messages
    1 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : IT Analyst & Software Developer
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 173
    Par défaut
    Tu peux poster ton code ?

  5. #5
    Membre confirmé Avatar de Vonziz
    Inscrit en
    Décembre 2006
    Messages
    215
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 215
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <asp:button id="_bEnvoyer" Runat="server" Text="Envoyer" CssClass="button" onClientClick="this.disabled = true"></asp:button>
    dans l'aspx.

  6. #6
    Membre Expert
    Avatar de Pongten
    Homme Profil pro
    IT Analyst & Software Developer
    Inscrit en
    Juin 2002
    Messages
    1 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : IT Analyst & Software Developer
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 173
    Par défaut
    De fait, OnClientClick n'existait pas en asp.net 1.1...

    Tu peux faire comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TonBoutton.Attributes.Add("onclick", "javascript:this.disabled = true;");


    et ça devrait aller normalement :-)

  7. #7
    Membre confirmé Avatar de Vonziz
    Inscrit en
    Décembre 2006
    Messages
    215
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 215
    Par défaut
    Alors nous progressons :-).

    Le bouton se grise bien mais les traitements serveur ne sont pas lancés.

    En gros, le passage dans l'évènementiel OnClick du Code Behind ne s'effectue pas. J'ai l'impression que le formulaire n'est pas submité par le bouton maintenant.

    NB : Bien vu pour la non prise en compte dans le 1.1. ;-)

  8. #8
    Membre Expert
    Avatar de Pongten
    Homme Profil pro
    IT Analyst & Software Developer
    Inscrit en
    Juin 2002
    Messages
    1 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : IT Analyst & Software Developer
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 173
    Par défaut
    et si tu rajoutes return true; après le this.disabled = true; ?

  9. #9
    Membre confirmé Avatar de Vonziz
    Inscrit en
    Décembre 2006
    Messages
    215
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 215
    Par défaut
    Aucun changement, rien n'est lancé côté serveur. Va-t-on y arriver? ^^

  10. #10
    Rédacteur
    Avatar de lutecefalco
    Profil pro
    zadzdzddzdzd
    Inscrit en
    Juillet 2005
    Messages
    5 052
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : zadzdzddzdzd

    Informations forums :
    Inscription : Juillet 2005
    Messages : 5 052
    Par défaut
    C'est normal, tu disables le bouton avant qu'il fasse appel à _DoPostBack.
    Faut inverser l'ordre.
    Je sais plus comment on fait, cherche sur google

  11. #11
    Membre confirmé Avatar de Vonziz
    Inscrit en
    Décembre 2006
    Messages
    215
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 215
    Par défaut
    Le problème étant que J'AI cherché sur Google, sinon je ne viendrais pas poluer les post de ce forum fort intéressant inutilement... ^^

    Il y a pas moyen de passer par un moyen tiers au disable afin qu'il puisse tout de même faire son doPostBack?!

  12. #12
    Membre éclairé Avatar de flogreg
    Profil pro
    Développeur informatique
    Inscrit en
    Mars 2004
    Messages
    432
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2004
    Messages : 432
    Par défaut
    il y a une autre solution mais c'est plus de la bidouille je pense. Tu crées un hiddenfield. Si il est vide, tu lances la recherche et tu le remplis. Sinon, tu ne fais rien. Quand ton action est terminé, tu le remets à blanc.


    Sinon, il y a ca : http://www.asp.net/AJAX/AjaxControlT...Animation.aspx

  13. #13
    Membre confirmé Avatar de Vonziz
    Inscrit en
    Décembre 2006
    Messages
    215
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 215
    Par défaut
    Hmmm alors ca peut marcher mais je n'aime pas trop ce genre de programmation (tu m'excuseras... ^^). C'est du travail intégré dans un milieu professionnel alors vaut mieux éviter ces pratiques. En plus, l'appui sur page précédente peut poser problème dans ton cas.

    Merci pour ta contribution en tout cas!

    Alors, ma question est si difficile que ca?! Personne n'arrive à la résoudre?! ^^

  14. #14
    Membre éclairé Avatar de flogreg
    Profil pro
    Développeur informatique
    Inscrit en
    Mars 2004
    Messages
    432
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2004
    Messages : 432
    Par défaut
    c'est ce que je disais, c'est de la bidouille. Mais sinon, as tu été voir le lien que je t'ai mis ? Je pense que ca pourrait très bien convenir à ton problème.

  15. #15
    Membre confirmé Avatar de Vonziz
    Inscrit en
    Décembre 2006
    Messages
    215
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 215
    Par défaut
    Alors c'est exactement ce comportement là que je souhaite mais dans l'exemple que tu me donnes, il s'agit apperement d'un composant .NET Ajax entièrement géré par le framework donc nous n'avons pas accès au code permettant de griser le bouton et de le dégriser (à part dans la source générée par le framework mais trop complexe).

    De plus, il s'agit d'Ajax donc la page ne se recharge pas pour faire d'éventuels traitements et sur mon application, la page doit se recharger pour effectuer les traitements (je ne peux pas tout refondre l'aspx, en plus c'est du .NET 1.1. donc l'Ajax... hmmmm).

    Merci encore pour ton aide mais on ne va pas dans le bon chemin!!! ^^

    Allez courage tout le monde, on va y arriver!!! ^^

  16. #16
    Rédacteur
    Avatar de lutecefalco
    Profil pro
    zadzdzddzdzd
    Inscrit en
    Juillet 2005
    Messages
    5 052
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : zadzdzddzdzd

    Informations forums :
    Inscription : Juillet 2005
    Messages : 5 052
    Par défaut
    Citation Envoyé par Vonziz Voir le message
    Le problème étant que J'AI cherché sur Google, sinon je ne viendrais pas poluer les post de ce forum fort intéressant inutilement... ^^

    Il y a pas moyen de passer par un moyen tiers au disable afin qu'il puisse tout de même faire son doPostBack?!
    T'as pas du cherché bien longtemps alors:
    http://www.codeproject.com/KB/aspnet...ionHijack.aspx
    http://www.eggheadcafe.com/software/...pt-window.aspx

  17. #17
    Membre confirmé Avatar de Vonziz
    Inscrit en
    Décembre 2006
    Messages
    215
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 215
    Par défaut
    Alors je te remercie beaucoup pour cette documentation.

    J'approche de plus en plus du but avec toutes vos informations mais je n'atteint toujours ce que je veux.

    Nouveau problème : La technique de redéfinir la méthode __doPostBack en javascript me paraît la bonne mais j'ai un gros gros problème.

    Dans mon IHM, j'utilise une DLL de navigation graphique qui m'insère déjà une redéfinition du __doPostBack dans la page générée côté serveur pour le client. Cette redéfinition est essentielle pour la navigation dans les onglets de mon IHM. Je vous donne la code généré :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    	function __doPostBack(eventTarget, eventArgument) {
    		var theform;
    		if (window.navigator.appName.toLowerCase().indexOf("microsoft") > -1) {
    			theform = document.Form1;
    		}
    		else {
    			theform = document.forms["Form1"];
    		}
    		theform.__EVENTTARGET.value = eventTarget.split("$").join(":");
    		theform.__EVENTARGUMENT.value = eventArgument;
    		theform.submit();
    	}
    Du coup, je ne peux pas inséré un script dans ma page via un Page.RegisterClientScriptBlock qui redéfinit mon __doPostBack sinon je casse la navigation de mon IHM.

    A titre informatif, la solution que je compte mettre en place est la suivante :

    Intégrer l'évènement suivant pour mon bouton dans le PageLoad :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    this._bEnvoyer.Attributes.Add("onclick", "disabled=true;");
    Injecter le code Javascript suivant via le PageLoad et la fonction Page.RegisterClientScriptBlock :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    <script language="javascript"  type="text/javascript">
     
     var netPostBack = __doPostBack;
     __doPostBack = EscapeHtml;
     
     function EscapeHtml (eventTarget, eventArgument) 
     {
     
     document.all.<nomBouton>.disabled = false;
    return netPostBack (eventTarget, eventArgument);
     }
    </script>
    Comment puis-je faire pour combiner les deux corps des méthodes Javascript sachant que je n'ai pas la main sur la génération du code d'une des deux?

  18. #18
    Membre confirmé Avatar de Vonziz
    Inscrit en
    Décembre 2006
    Messages
    215
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 215
    Par défaut
    Bon après compréhension de tous les mécanisme du __doPostBack, je me suis rendu compte que l'exemple cité ci-dessus était bon sans fusionner les corps de fonctions.

    Je n'avais pas compris le mécanisme des pointeurs sur fonctions en Javascript en fait.

    Donc, au final, malgré le fait de réactiver le bouton avant d'aller dans la fonction __doPostBack classique, ca ne change rien.

    Le bouton se grise mais l'appel serveur ne s'effectue pas... Je commence à désespérer! ^^ Tous les autres possibilités que je trouve, c'est avec le .NET 2.0.

    Help me plz! ^^

  19. #19
    Membre éclairé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    44
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 44
    Par défaut
    Salut

    je débarque dans la discussion...
    Je sais pas si ca peut t'aider mais il y a une solution qui devrait marcher :
    créer un petit extender ajax.
    Je m'explique :
    habituellement un extender ajax est un control que tu rattaches à un control asp (par exemple le modalpopupextender est rattaché à un asp:panel).
    Dans le cadre du projet sur lequel je travaille, on a codé quelques extenders dont un par exemple qui permet d'effectuer une validation d'adresse dès que les 3 textbox qui lui sont rattachées (nom de la rue, code postal et ville) ont été renseignées par le client.

    Tu pourrais coder un extender dont le Target (control associé) serait ton linkbutton et qui s'abonnerait à son évènement onclick pour venir le désactiver une fois cliqué sans géner le postback.

    C'est une problématique que nous avons aussi et meme si on a n'a pas encore pris le temps d'y réfléchir je pense que le moyen le plus propre est de passer par un extender ajax.

    Je n'ai malheureusement pas le temps de creuser le sujet plus en avant (boulot oblige...) mais si d'ici quelques jours ton problème n'est toujours pas résolu, j'essaierai de trouver le temps de coder un truc.

  20. #20
    Membre confirmé Avatar de Vonziz
    Inscrit en
    Décembre 2006
    Messages
    215
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 215
    Par défaut
    Hmmm alors si je comprends bien, ton extender vient modifier l'intégrité de ton composant de manière externe.

    Mais en quoi le fait que l'extender désactive le bouton ne gênerait-il pas le __doPostBack?!

    Car au moment du __doPostBack, le problème sera le même : après action de l'extender, le bouton est désactivé donc le submit dans le __doPostBack ne peut pas avoir lieu...

    A moins que quelque chose m'est échapé?!

Discussions similaires

  1. [ZF1.9.2] désactivation bouton après clic
    Par vince29 dans le forum Zend Framework
    Réponses: 5
    Dernier message: 15/03/2011, 15h09
  2. désactiver une image bouton
    Par vraipolite dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 05/06/2006, 12h06
  3. erreur Constante? sur bouton de clic
    Par aarlock dans le forum Access
    Réponses: 5
    Dernier message: 28/04/2006, 16h04
  4. Réponses: 2
    Dernier message: 23/01/2006, 19h56
  5. Submit et bouton entrée
    Par Canou dans le forum Général JavaScript
    Réponses: 9
    Dernier message: 20/10/2004, 16h45

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo