2008-11-13 8 views
3

Я пытаюсь отключить кнопку, когда пользователь отправляет форму платежа, а код для отправки формы вызывает двойную запись в firefox. Эта проблема не возникает при удалении кода и не встречается ни в одном браузере, кроме Firefox.Отключить кнопку после отправки

Любая идея, как предотвратить двойной пост здесь?

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()); 

это sb.append (Page.GetPostBackEventReference (btnSubmit)) линия, которая вызывает проблему

Благодарности

EDIT: Вот с # кнопки:

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

вот html

Этот код дважды вводит (и отключает кнопку отправки и проверяет ввод):

<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" /> 


сообщений Этот код дважды (но не отключить кнопку отправки):

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


Этот код сообщения один раз (но не проверяет ввод пользователя и не отключает кнопка отправить):

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


Этот код сообщения один раз (но не отключить кнопку отправки):

<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" /> 

Этот код не размещать на всех:

<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" /> 

Очевидно, что это отключение кнопки отправки, который ставит проблему. У вас есть идеи, как мы можем отключить отправку, чтобы избежать множественного нажатия?

ответ

4

Предположительно, btnSubmit уже подключен к серверной программе. Если это так, вызов Page.GetPostBackEventReference не требуется. Вы должны получить желаемое поведение, просто удалив эту строку.

Обновление: Вы упомянули о прикреплении обработчика события в коде C#, но не упоминаете, где вы это делаете. Я предполагаю, что это в обработчике Page_Load. Если это так, это не сработает должным образом, так как слишком поздно подключить обработчик события нажатия кнопки в этот момент. Давайте попробуем это вместо этого.

Во-первых, было бы проще поместить JS в свою собственную функцию, а не строить его в коде C#. Я полагаю, что вы положили его в блок сценария

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

И кнопке ASPX, попробуйте это (или еще лучше, это собственный .js файл.):

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

Когда я удалить эту линию он фактически не представить. У меня есть это прикрепленное к кнопке, но оно никогда не вызывает эту функцию, когда этой строки нет: this.btnSubmit.Click + = new EventHandler (btnSumbit_Click); – 2008-11-13 03:34:49

+0

Хм. Можете ли вы попробовать добавить return true; до конца вашего блока JavaScript и посмотреть, что произойдет? – 2008-11-13 04:07:45

0

Возьмите эту линию, форма уже будет отправлена, потому что это кнопка отправки, а не обычный тип кнопки, посмотрите, как ASP.NET выводит элемент.

Валидаторы страниц вызывают в форме обратный вызов формы, поэтому, если ваша страница недействительна, она будет проверена там.

Итак, просто удалите эту строку, и вы будете установлены.

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

Ответ заключается в добавлении возврата false; после последней строки;

, например

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

должен быть

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

это определенно работает для меня.

0

Try ниже код

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

Попробуйте это:

<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" /> 
Смежные вопросы