Как предотвратить двойную отправку с помощью jQuery в приложении ASP.NET с помощью UpdatePanels

У меня есть приложение Intranet ASP.NET, которое иногда медленно реагирует. Мое требование состоит в том, чтобы предотвратить двойную отправку, и в идеале предоставить обратную связь пользователю, что форма уже была отправлена.

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

From a submit button. From any control with AutoPostBack = true (which submits using javascript AFAIK). From either of the above within an UpdatePanel - in which case as I understand it, the POST is done using AJAX, and I would need to re-enable when the AJAX call is complete.

Я имею в виду что-то вроде отображения всплывающего / модального всплывающего окна, возможно, с анимированным прогрессивным изображением, которое будет отображаться при отправке. И в случае UpdatePanel, скрытый после завершения вызова AJAX.

У кого-нибудь есть пример, который можно легко интегрировать в страницы ASP.NET, как указано выше? Или укажите, какие события мне нужно подключить, чтобы отобразить / скрыть наложение.

UPDATE

@ Аристос & APOS; ответ получил меня большую часть пути туда. Ключевой частью является обработка PageRequestManager.endRequest, чтобы скрыть диалог прогресса после завершения вызова AJAX.

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

Ответы на вопрос(1)

Решение Вопроса

как:

Page.Form.Attributes["onsubmit"] = "return fAllowToSubmit();";

и вы открываете закрывающий флаг для отправки при отправке через панель обновления и ждете возврата.

 <script type="text/javascript"> 
    var _fAllowToSubmit = true;
    // here you can throw and an alert() when _fAllowToSubmit==false
    function fAllowToSubmit() 
     {
        if(!_fAllowToSubmit)
          alert("Please wait for the page to be updated");

       return _fAllowToSubmit;
     }

    // to avoid calling it before the Sys loaded
    jQuery(document).ready(function() {
      var prm = Sys.WebForms.PageRequestManager.getInstance();    
       prm.add_initializeRequest(InitializeRequest);
       prm.add_endRequest(EndRequest);
    });

    function InitializeRequest(sender, args) {
       _fAllowToSubmit = false;
       // to make it even nicer you can place here a fade css class
       // it will auto-clear with the next update.
       jQuery("#YourWarpDiv").addClass("FadedDiv");
    }

    function EndRequest(sender, args) {
        _fAllowToSubmit = true;
    }
</script>

и

.FadedDiv
{
    background-color: white;
    filter:alpha(opacity=50);
    opacity: 0.5;
    -moz-opacity:0.50;
}

Конечно, у вас также есть «пожалуйста, подождите» сообщение, которое может открываться автоматически с помощью панели обновления.

 05 июл. 2012 г., 12:50
Post / Redirect / Get не работает для вызовов ajax, таких как UpdatePanel.
 15 нояб. 2012 г., 09:24
+1 Это добилось успеха на ASP.NET 4.0, спасибо! :)
 Joe05 июл. 2012 г., 17:50
+1, это дало мне большую часть пути туда. Смотрите обновление к вопросу.
 Joe05 июл. 2012 г., 19:21
Я получил загрузку, даже с UpdatePanel, используя cookie для определения завершения загрузки, как описано в вопросе, который я связал. В очередной раз благодарим за помощь.
 05 июл. 2012 г., 18:21
@ Джо Я не уверен, что упомянутое вами дело работает с updatePanel. Также, если вы не возвращаете действительное состояние просмотра после триггера UpdatePanel, у вас есть проблема с UpdatePanel. Я также всегда избегаю посылать файлы таким способом, правильный способ - иметь ссылку на дескриптор, который отправляет файл. Чтобы закончить решение, можно проверить, какой идентификатор кнопки называется InitializeRequest, что легко сделать с помощью функции UpdatePanel -

Ваш ответ на вопрос