Я пытаюсь отключить кнопку, когда пользователь отправляет форму оплаты, а код для публикации формы вызывает двойную публикацию в 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("ctl00$MainContent$cmdSubmit", "", true, "", "", false, false))" id = "ctl00_MainContent_cmdSubmit" />
Этот код вообще не публикуется:
<input type = "submit" name = "ctl00$MainContent$cmdSubmit" value = "Submit" onclick = "this.disabled = true;WebForm_DoPostBackWithOptions(new WebForm_PostBackOptions("ctl00$MainContent$cmdSubmit", "", true, "", "", false, false))" id = "ctl00_MainContent_cmdSubmit" />
Очевидно, проблема связана с отключением кнопки отправки. У вас есть идеи, как мы можем отключить отправку, чтобы избежать многократного нажатия?





Предположительно, к 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);" />
Хм. Можете ли вы попробовать добавить return true; в конец вашего блока JavaScript и посмотрите, что произойдет?
нет .. это не помогло. Кнопки отключаются и снова включаются, и ничего не отправляется.
Кнопка НЕ должна отображаться. Вы уверены, что не отправляете ответ?
Я понятия не имею, куда будет отправляться мой код. Я не могу найти ничего, что могло бы сделать это, но это определенно повторно включает кнопку - однако страница не обновляется.
Мне нужно было бы увидеть больше вашего кода, если бы это не помогло. Можете ли вы добавить более полный пример частей HTML и C#?
Я добавил несколько примеров, которые пытался ответить на вопрос. Спасибо за вашу помощь
Хорошо, я расширил ответ более подробно. Сообщите нам, работает ли это.
Это тоже не сработало. Он отключает, повторно включает и не отправляет. Прикрепляю обработчик событий в OnInit.
Похоже, что серверная обратная передача все еще происходит независимо от запущенного обработчика нажатия кнопки. Я не уверен, что еще мы могли бы рассказать вам, не увидев полного исходного кода.
Хорошо, в любом случае спасибо. Я немного углублюсь в код, чтобы увидеть, смогу ли я найти источник проблемы. Я ценю вашу попытку помочь.
Уберите эту строку, форма уже будет отправлена, потому что это кнопка отправки, а не обычный тип кнопки, посмотрите, как 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" />
Это не дает ответа на вопрос. Чтобы критиковать или запрашивать разъяснения у автора, оставьте комментарий под его сообщением - вы всегда можете комментировать свои собственные сообщения, и как только у вас будет достаточно репутация, вы сможете комментировать любой пост.
@VictorPolevoy - в ответе есть код, но он не был отформатирован как таковой, поэтому StackOverflow его скрыл. Вы можете увидеть это, отредактировав ответ. Я избегал этого, потому что это некачественный ответ даже с кодом; нет объяснения того, что он делает и т. д.
Я исправил это, однако вам действительно стоит объяснить, что делает ваш код, как работают ваши решения.
Пожалуйста, объясните, что делает ваш код и почему он решает проблему. Ответ, который просто содержит код (даже если он работает), обычно не помогает OP понять их проблему.
Когда я удаляю эту строку, она фактически не отправляется. У меня он прикреплен к кнопке, но он никогда не вызывает эту функцию, когда этой строки нет: this.btnSubmit.Click + = new EventHandler (btnSumbit_Click);