Отключить кнопку после отправки - PullRequest
3 голосов
/ 13 ноября 2008

Я пытаюсь отключить кнопку, когда пользователь отправляет форму оплаты и код для публикации формы вызывает двойное сообщение в 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)), вызывающая проблему

Спасибо

РЕДАКТИРОВАТЬ: Вот c # кнопки:

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

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

Ответы [ 6 ]

4 голосов
/ 13 ноября 2008

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

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

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

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

А для кнопки ASPX попробуйте следующее:

<asp:Button ID="cmdSubmit" runat="server" Text="Submit" onclick="btnSumbit_Click" OnClientClick="return disableOnSubmit(this);" />
1 голос
/ 30 марта 2010

Ответ - добавить ложь; после вашей последней строки;

например

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

должно быть

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

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

0 голосов
/ 07 августа 2015

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

<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 голосов
/ 09 июня 2014

Попробуйте код ниже

<asp:Button ID="cmdSubmit" runat="server" Text="Submit" onclick="btnSumbit_Click" OnClientClick="this.style.display = 'none';"/>
0 голосов
/ 16 декабря 2009
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());
    }
0 голосов
/ 13 ноября 2008

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

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

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

...