2008-11-13 9 views
3

J'essaie de désactiver un bouton lorsqu'un utilisateur soumet un formulaire de paiement et que le code pour publier le formulaire provoque un double post dans Firefox. Ce problème ne se produit pas lorsque le code est supprimé et n'apparaît dans aucun navigateur autre que Firefox.Désactiver le bouton après l'envoi

Une idée comment empêcher le double post ici?

System.Text.StringBuilder sb = new StringBuilder(); 
sb.Append("if (typeof(Page_ClientValidate) == 'function') { "); 
sb.Append("if (Page_ClientValidate() == false) { return false; }} "); 
sb.Append("this.value = 'Please wait...';"); 
sb.Append("this.disabled = true;"); 
sb.Append(Page.GetPostBackEventReference(btnSubmit)); 
sb.Append(";"); 
btnSubmit.Attributes.Add("onclick", sb.ToString()); 

c'est la sb.Append ligne (Page.GetPostBackEventReference (btnSubmit)) qui est l'origine du problème

Merci

EDIT: Voici le C# du bouton:

<asp:Button ID="cmdSubmit" runat="server" Text="Submit" /> 

Voici le code

Ce code poste deux fois (et désactive le bouton de soumission et vérifie l'entrée):

<input type="submit" name="ctl00$MainContent$cmdSubmit" value="Submit" onclick="if (typeof(Page_ClientValidate) == 'function') { if (Page_ClientValidate() == false) { return false; }} this.value = 'Please wait...';this.disabled = true;document.getElementById('ctl00_MainContent_cmdBack').disabled = true;__doPostBack('ctl00$MainContent$cmdSubmit','');" id="ctl00_MainContent_cmdSubmit" /> 


Ce code des postes deux fois (mais ne pas désactiver le bouton d'envoi):

<input type="submit" name="ctl00$MainContent$cmdSubmit" value="Submit" onclick="__doPostBack('ctl00$MainContent$cmdSubmit','');" id="ctl00_MainContent_cmdSubmit" /> 


Ce message de code une fois (mais ne vérifie pas l'entrée d'utilisateur et ne désactive pas la le bouton d'envoi):

<input type="submit" name="ctl00$MainContent$cmdSubmit" value="Submit" id="ctl00_MainContent_cmdSubmit" /> 


Ce message de code une fois (mais ne désactivez pas le bouton soumettre):

<input type="submit" name="ctl00$MainContent$cmdSubmit" value="Submit" onclick="javascript:WebForm_DoPostBackWithOptions(new WebForm_PostBackOptions(&quot;ctl00$MainContent$cmdSubmit&quot;, &quot;&quot;, true, &quot;&quot;, &quot;&quot;, false, false))" id="ctl00_MainContent_cmdSubmit" /> 

Ce code ne publie pas du tout:

<input type="submit" name="ctl00$MainContent$cmdSubmit" value="Submit" onclick="this.disabled = true;WebForm_DoPostBackWithOptions(new WebForm_PostBackOptions(&quot;ctl00$MainContent$cmdSubmit&quot;, &quot;&quot;, true, &quot;&quot;, &quot;&quot;, false, false))" id="ctl00_MainContent_cmdSubmit" /> 

De toute évidence, il est la désactivation du bouton d'envoi qui est de poser le problème. Avez-vous des idées sur la façon dont nous pouvons désactiver la soumission pour éviter les clics multiples?

Répondre

4

Vraisemblablement, btnSubmit a déjà un événement côté serveur connecté. Si c'est le cas, l'appel à Page.GetPostBackEventReference ne devrait pas être nécessaire. Vous devriez obtenir votre comportement désiré simplement en supprimant cette ligne. Mise à jour: Vous avez mentionné l'ajout du gestionnaire d'événements au code C#, mais vous ne mentionnez pas où vous faites cela. Je suppose que c'est dans le gestionnaire Page_Load. Si tel est le cas, cela ne fonctionnerait pas correctement, car il est trop tard pour raccorder un gestionnaire d'événement de clic de bouton à ce stade. Essayons cela à la place. D'abord, il serait plus propre de placer le JS dans sa propre fonction plutôt que de le construire dans le code C# derrière. Je vous suggère de le mettre dans un bloc de script

function disableOnSubmit(target) 
{ 
    if (typeof(Page_ClientValidate) == 'function') { 
     if (Page_ClientValidate() == false) { return false; } 
    } 
    target.value = 'Please wait...'; 
    target.disabled = true; 
    return true; 
} 

Et pour votre bouton ASPX, essayez ceci (ou mieux encore, il est propre fichier .js.):

<asp:Button ID="cmdSubmit" runat="server" Text="Submit" onclick="btnSumbit_Click" OnClientClick="return disableOnSubmit(this);" /> 
+0

Quand je supprimer cette ligne, il ne présente pas réellement. J'ai ceci attaché au bouton mais il n'appelle jamais cette fonction quand cette ligne n'est pas là: this.btnSubmit.Click + = new EventHandler (btnSumbit_Click); –

+0

Hmm. Pouvez-vous essayer d'ajouter return true; à la fin de votre bloc JavaScript et voir ce qui se passe? –

+0

non .. qui n'a pas aidé. Les boutons sont désactivés et réactivés et rien n'est soumis. –

0

retirer cette ligne, le formulaire sera déjà soumis car il s'agit d'un bouton de soumission, pas un type de bouton standard, regardez comment ASP.NET rend l'élément.

Les validateurs de page sont appelés dans le rappel form.onsubmit, donc si votre page n'est pas valide, elle sera validée ici. Donc, supprimez simplement cette ligne et vous serez défini.

0
private void checkButtonDoubleClick(Button button) 
    { 
     System.Text.StringBuilder sbValid = new System.Text.StringBuilder(); 
     sbValid.Append("if (typeof(Page_ClientValidate) == 'function') { "); 
     sbValid.Append("if (Page_ClientValidate() == false) { return false; }} "); 
     sbValid.Append("this.value = 'Please wait...';"); 
     sbValid.Append("this.disabled = true;"); 
     sbValid.Append(this.Page.ClientScript.GetPostBackEventReference(button, "")); 
     sbValid.Append(";return false;"); 
     button.Attributes.Add("onclick", sbValid.ToString()); 
    } 
1

La réponse est l'ajout d'un retour false; après votre dernière ligne;

par exemple

sbValid.Append(this.Page.ClientScript.GetPostBackEventReference(button, "")); 
sbValid.Append(";"); 

doit être

sbValid.Append(this.Page.ClientScript.GetPostBackEventReference(button, "")); 
sbValid.Append(";return false;"); 

ce vraiment travaillé pour moi.

0

Essayez ci-dessous le code

<asp:Button ID="cmdSubmit" runat="server" Text="Submit" onclick="btnSumbit_Click" OnClientClick="this.style.display = 'none';"/> 
-1

Essayez ceci:

<asp:Button ID="btn" runat="server" Text="something" onclick="btn_Click" 
ValidationGroup="V1" onClientClick="if(Page_ClientValidate('V1')) 
{this.disabled=true;this.value='Please Wait....';__doPostBack(this.id);} 
"UseSubmitBehavior="false" /> 
+0

Ceci ne fournit pas de réponse à la question. Pour critiquer ou demander des éclaircissements à un auteur, laissez un commentaire en dessous de son message - vous pouvez toujours commenter vos propres messages, et une fois que vous aurez suffisamment de [réputation] (http://stackoverflow.com/help/whats-reputation) vous pourrez être capable de [commenter sur n'importe quel post] (http://stackoverflow.com/help/privileges/comment). –

+0

@VictorPolevoy - il y a du code dans la réponse, mais il n'a pas été formaté en tant que tel, donc StackOverflow l'a caché. Vous pouvez le voir en éditant la réponse. J'ai évité de le faire parce que c'est une réponse de mauvaise qualité même avec le code; Il n'y a pas d'explication sur ce qu'il fait, etc. –

+0

J'ai corrigé ceci, cependant, vous devriez vraiment expliquer ce que fait votre code, comment fonctionnent vos solutions. –

Questions connexes