Предотвращение случайного двойного нажатия на кнопку

StackOverflow https://stackoverflow.com/questions/50426

  •  09-06-2019
  •  | 
  •  

Вопрос

У меня есть несколько элементов управления, которые наследуются от ASP.NET buttons и используют 'onserverclick'.

Если пользователь нажимает дважды, кнопка запускает два события на стороне сервера.Как я могу предотвратить это?

Я попытался установить "this.disabled='true'" после щелчка (в атрибуте 'onclick') через javascript, но это также блокирует первую обратную передачу.

Это было полезно?

Решение

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

http://encosia.com/2007/04/17/disable-a-button-control-during-postback/

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

Вы не обязательно хотите показывать кнопку отключенной при обратной передаче.Вы хотите убедиться, что они случайно не отправят запрос дважды.Таким образом, отключение или скрытие кнопки в результате серверная часть действовать в игре уже слишком поздно.К этому моменту 2-й запрос уже в пути.Вам нужно либо сделать это с помощью javascript, либо убедиться, что ваш серверный код не будет выполняться дважды.

В случае updatepanel и кнопки внутри FormView-шаблона я использую следующий подход:

<script type="text/javascript">
    // Using that prm reference, hook _initializeRequest
    Sys.WebForms.PageRequestManager.getInstance().add_initializeRequest(InitializeRequestBuchung);

    // Abfangen von Mehrfachklicks auf Buttons für asynchrone Postbacks im Updatepanel
    function InitializeRequestBuchung(sender, args) {
        var arrButtonIds = ["ButtonInsert", "ButtonUpdate"];

        // Get a reference to the PageRequestManager.
        var prm = Sys.WebForms.PageRequestManager.getInstance();
        if (prm.get_isInAsyncPostBack() & jQuery.inArray(args.get_postBackElement().id, arrButtonIds) > -1) {
            args.set_cancel(true);
        }
    }
</script>

Это отменяет следующую обратную передачу, если в данный момент асинхронная обратная передача все еще активна.Работает отлично.

Кто-то еще сказал это где-то здесь несколько дней назад, и я согласен - используйте javascript, чтобы просто скрыть кнопка вместо того, чтобы отключать ее;вы могли бы показать изображение "spinner" на его месте, которое позволяет пользователю узнать, что происходит.

Вместо того чтобы прятаться, я поменял местами кнопки с помощью javascript.Покажите другое изображение, выделенное серым цветом, при нажатии первой кнопки.

Установите для свойства кнопки UseSubmitBehavior значение false.Затем создайте функцию OnClientClick, которая отключает кнопку.Это выглядело бы примерно так:

<script type="text/javascript">
   function disableFunctn(button){
       button.disabled = true;
   }
</script>
<asp:Button ID="button1" UseSubmitBehavior="false" OnClientClick="disableFunctn(this);"/>

самый быстрый и дешевый способ:

<asp:Button ID="button1" UseSubmitBehavior="false" OnClientClick="this.disabled=true;"/>

Вы также можете попробовать, например, btnSave.Enable = false;при нажатии кнопки и до того, как будет выполнена обработка кнопки в процедуре события щелчка.Если вам нужно сбросить его, чтобы разрешить его включение, используйте отдельную кнопку, которая сбрасывает кнопку для повторного использования.

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top