Отключить кнопку после отправки

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

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

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
3
0
14 813
6

Ответы 6

Предположительно, к 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);" />

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

Chris Philpotts 13.11.2008 06:34

Хм. Можете ли вы попробовать добавить return true; в конец вашего блока JavaScript и посмотрите, что произойдет?

Jeromy Irvine 13.11.2008 07:07

нет .. это не помогло. Кнопки отключаются и снова включаются, и ничего не отправляется.

Chris Philpotts 13.11.2008 07:16

Кнопка НЕ ​​должна отображаться. Вы уверены, что не отправляете ответ?

FlySwat 13.11.2008 07:17

Я понятия не имею, куда будет отправляться мой код. Я не могу найти ничего, что могло бы сделать это, но это определенно повторно включает кнопку - однако страница не обновляется.

Chris Philpotts 13.11.2008 08:16

Мне нужно было бы увидеть больше вашего кода, если бы это не помогло. Можете ли вы добавить более полный пример частей HTML и C#?

Jeromy Irvine 13.11.2008 22:17

Я добавил несколько примеров, которые пытался ответить на вопрос. Спасибо за вашу помощь

Chris Philpotts 14.11.2008 05:26

Хорошо, я расширил ответ более подробно. Сообщите нам, работает ли это.

Jeromy Irvine 14.11.2008 16:22

Это тоже не сработало. Он отключает, повторно включает и не отправляет. Прикрепляю обработчик событий в OnInit.

Chris Philpotts 14.11.2008 17:22

Похоже, что серверная обратная передача все еще происходит независимо от запущенного обработчика нажатия кнопки. Я не уверен, что еще мы могли бы рассказать вам, не увидев полного исходного кода.

Jeromy Irvine 14.11.2008 23:27

Хорошо, в любом случае спасибо. Я немного углублюсь в код, чтобы увидеть, смогу ли я найти источник проблемы. Я ценю вашу попытку помочь.

Chris Philpotts 17.11.2008 07:15

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

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

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

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

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

Например

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

должно быть

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

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

Попробуйте под кодом

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

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

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

Это не дает ответа на вопрос. Чтобы критиковать или запрашивать разъяснения у автора, оставьте комментарий под его сообщением - вы всегда можете комментировать свои собственные сообщения, и как только у вас будет достаточно репутация, вы сможете комментировать любой пост.

Victor Polevoy 07.08.2015 12:40

@VictorPolevoy - в ответе есть код, но он не был отформатирован как таковой, поэтому StackOverflow его скрыл. Вы можете увидеть это, отредактировав ответ. Я избегал этого, потому что это некачественный ответ даже с кодом; нет объяснения того, что он делает и т. д.

Wai Ha Lee 07.08.2015 12:42

Я исправил это, однако вам действительно стоит объяснить, что делает ваш код, как работают ваши решения.

Victor Polevoy 07.08.2015 12:44

Пожалуйста, объясните, что делает ваш код и почему он решает проблему. Ответ, который просто содержит код (даже если он работает), обычно не помогает OP понять их проблему.

рüффп 07.08.2015 12:44

Другие вопросы по теме