Подтвердить что ты не робот

Запретить двойное нажатие кнопки asp.net

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

У меня есть кнопка, которая при нажатии вызывает API, поэтому есть 1 секунда задержки.

Я пробовал несколько вещей, которые ничего не работают.

btnSave.Attributes.Add("onclick", " this.disabled = true; " + ClientScript.GetPostBackEventReference(btnSave, null) + ";");

Даже это ничего не делает.

4b9b3361

Ответ 1

Предотвратите двойной щелчок. Пожалуйста, добавьте ниже код на страницу aspx.

<script type="text/javascript" language="javascript">

   Sys.WebForms.PageRequestManager.getInstance().add_beginRequest(BeginRequestHandler);
   function BeginRequestHandler(sender, args) { var oControl = args.get_postBackElement(); oControl.disabled = true; }

</script>

Ответ 2

Это решение является простым и эффективным. На вашей кнопке введите этот код:

OnClientClick="return CheckDouble();"

И везде, где вы хотите, чтобы ваш JavaScript - например, В нижней части страницы:

<script type="text/javascript">
   var submit = 0;
   function CheckDouble() {
     if (++submit > 1) {
     alert('This sometimes takes a few seconds - please be patient.');
     return false;
   }
 }
 </script>

Ответ 3

Вы можете предотвратить двойное нажатие с помощью этого кода:

Me.btnSave.Attributes.Add("onclick", "this.disabled=true;")
Me.btnSave.UseSubmitBehavior = False

Таким образом, вы можете использовать btnSave_Click для вызова вашего API.

Обычно у меня есть много Validators в моей настройке Page: Validator.SetFocusOnError = True. Я могу запустить этот код для повторного использования кнопки сохранения, если проверка не удалась.

Me.YourControl.Attributes.Add("onfocus", Me.btnSave.ClientID & ".removeAttribute('disabled');")

Ответ 4

Большинство приведенных выше предложений не помогли мне. Тот, кто работал, был следующим теццо:

Me.btnSave.Attributes.Add("onclick", "this.disabled=true;")
Me.btnSave.UseSubmitBehavior = False

Проще говоря, вместо использования вышеприведенного кода в коде, используйте только следующее:

   <asp:Button ID="btnSave" runat="server" Text="Save" 
      UseSubmitBehavior="false"
      OnClientClick="this.disabled='true';" 
   </asp:button>

UseSubmitBehavior = "false" - это ключ.

Ответ 5

Предотвратите двойной щелчок. Пожалуйста, добавьте ниже код на страницу aspx

<script type = "text/javascript">
function DisableButton() {
document.getElementById("<%=Button1.ClientID %>").disabled = true;
}
window.onbeforeunload = DisableButton;
</script>

Ответ 6

Сначала мое решение выглядит так:

<script>
function disableButton(btn) {
    setTimeout(function () { btn.disabled = true; }, 20);
    return true;
}
</script>
<asp:Button runat="server" ID="btnSave" Text="Save" OnClick="btnSave_Click" OnClientClick="return disableButton(this);" />

Без setTimeout кнопка будет немедленно отключена, а затем событие OnClick не будет запущено. Недостаток этого подхода заключается в том, что кнопка "Сохранить" больше не будет доступна, если какая-то проверка завершится неудачно или произойдет какая-то ошибка.

Поэтому я не думаю, что отключение кнопки - это хорошее решение, и я придумаю другое решение:

     function disableButton(btn) {
        if (btn.hasclicked) return false;
        btn.hasclicked = 1;
        btn.onmouseenter = function () { this.hasclicked = 0; };
        return true;
    }

Но мой коллега отмечает, что, если пост-обработка очень медленная, до ее завершения пользователь все еще может выполнить двойной постбэк, нажав и удерживая нажатой кнопку ввода. Поэтому я нашел еще два решения:

  1. Запустите проверку от клиента перед отправкой формы. Но если ваша страница содержит несколько ValidationGroup, говорят, что следующая Page_ClientValidate() должна вызываться несколько раз с переданным параметром ValidationGroup: например, Page_ClientValidate ( "group1"):

function disableButton(btn) {
  if (Page_ClientValidate) {
    Page_ClientValidate();
    if (!Page_IsValid) {
      btn.setAttribute("btnClicked", "n");
      return true;
    }
  }
  if (btn.getAttribute("btnClicked") == "y") {
    return false;
  } else {
    btn.setAttribute("btnClicked", "y");
    return true;
  }
}

Ответ 7

Попробуйте это, это рабочее решение:

Для всех браузеров, включая браузер Opera Mobile, который не поддерживает js, ваша форма не будет блокироваться в браузерах этого типа.

Добавьте это в метод Page_load():

BtnID.Attributes.Add("onclick", "if(typeof (Page_ClientValidate) === 'function' && !Page_ClientValidate()){return false;} this.disabled = true;this.value = 'Working...';" + ClientScript.GetPostBackEventReference(BtnID, null) + ";");

Ответ 8

Это тот, который я нашел, работает во всех случаях.

<form id="form1" runat="server">
<asp:Button ID="Button1" runat="server" Text="Button1" OnClick="Button1_Clicked" />
<asp:Button ID="Button2" runat="server" Text="Button2" />
</form>

Now heres the short JavaScript snippet that will disable the button as soon as it is clicked so that when PostBack occurs the button cannot be clicked again.
<script type = "text/javascript">
function DisableButton() {
    document.getElementById("<%=Button1.ClientID %>").disabled = true;
}
window.onbeforeunload = DisableButton;
</script>

The above script disables the ASP.Net Button as soon as the page is ready to do a PostBack or the ASP.Net form is submitted.
But in cases you might want to disable all Buttons and Submit Buttons on the page hence for such cases I have created another function which disables all Buttons and Submit buttons whenever theres a PostBack or form submission
<script type = "text/javascript">
function DisableButtons() {
    var inputs = document.getElementsByTagName("INPUT");
    for (var i in inputs) {
        if (inputs[i].type == "button" || inputs[i].type == "submit") {
            inputs[i].disabled = true;
        }
    }
}
window.onbeforeunload = DisableButtons;
</script>