Управление асинхронными запросами

При использовании элемента управления UpdatePanel обработку асинхронных запросов ASP.NET AJAX выполняет класс PageRequestManager. Наиболее важная его особенность – это способность прерывать затянувшееся ожидание ответа от сервера. Экранная заставка во время ожидания – это очень неплохо, но если запрос исполняется слишком долго, то через некоторое время необходимо что-то предпринимать.

Чтобы прервать затянувшийся запрос, для начала необходимо получить доступ к соответствующему экземпляру PageRequestManager. На каждой странице может быть только один такой экземпляр. Для обращения к нему используется следующий синтаксис:
Sys.WebForms.PageRequestManager.getInstance();

К экземпляру класса PageRequestManager можно присоединять свои обработчики событий. Поддерживаются следующие события:
beginRequest
Перед отправкой запроса серверу.
endRequest
После того как запрос будет завершен.
initializeRequest
Запрос был инициализирован.
pageLoaded
Содержимое страницы было обновлено в результате запроса.
pageLoading
Данные от сервера были получены, но страница еще не обновлялась.

Эти события возникают в следующем порядке:
initializeRequest, beginRequest, pageLoading, pageLoaded и endRequest.

Следующий пример предоставляет пользователю возможность щелчком на кнопке прервать затянувшийся запрос.


Кнопка инициирует отправку на сервер своих собственных данных. А для того, чтобы инициализировать новый запрос, необходимо прервать исполнение текущего. Чтобы обеспечить такое поведение, в обработчике события initializeRequest необходимо выполнить некоторые действия:

var manager = Sys.WebForms.PageRequestManager.getInstance();
manager.add_initializeRequest(abortPendingPostback);

Функция JavaScript abortPendingPostback() автоматически получает два аргумента (подобно методам обработки событий в .NET): объект, который породил событие, и дополнительные аргументы, если они имеются. В случае с классом PageRequestManager дополнительные аргументы имеют чрезвычайно важное значение. Для доступа к элементу, инициировавшему отправку запроса, можно использовать метод get_postBackElement().

Кроме того, могут пригодиться следующие два метода PageRequestManager:
abortPostback()
Прерывает исполнение запроса
get_isInAsyncPostBack()
Проверяет, занят ли в настоящее время PageRequestManager обработкой асинхронного запроса

Эти методы делают возможным прерывание затянувшихся запросов. Воспользуемся примером 6.4 в качестве отправной точки и добавим новую кнопку для отмены запроса:
(asp:Button ID="Button2" runat="server"
Text="Abort postback" Style="display:none;" /)

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

(asp:Button ID="Button1" runat="server"
Text="Do something" OnClick="WaitFiveSeconds"
OnClientClick="$get('Button2').style.display='';" /)

Теперь пришло время заняться логикой сценария.


Сначала функция abortPendingPostback() определяет, не занят ли в настоящее время PageRequestManager обработкой запроса. После этого она отыскивает атрибут id отправителя, чтобы узнать, какая из кнопок была нажата. (Метод abortPendingPostback() вызывается по щелчку на любой из двух кнопок, поскольку обе кнопки инициируют отправку запроса.)

Если щелчок был произведен на кнопке «отмены», производится прерывание запроса:
function abortPendingPostback(sender, eventArgs) {
var manager = Sys.WebForms.PageRequestManager.getInstance();
if (manager.get_isInAsyncPostBack() &&
eventArgs.get_postBackElement().getAttribute("id") == "Button2") {
manager.abortPostBack();
}
}

Единственное, что остается сделать после отправки запроса, – скрыть вторую кнопку:
Button2.Style["display"] = "none";
В примере 6.5 демонстрируется полный программный код страницы, в которой предусмотрена возможность отмены асинхронного HTTP-запроса. На рис. 6.6 показано, как выглядит эта страница в броузере.
Пример 6.5. Экранная заставка для UpdatePanel с возможностью отмены
UpdateProgressAbort.aspx
<%@ Page Language="C#" %>
"http://www.w3.org/TR/xhtml1/DTD/xhtml1?transitional.dtd">
ASP.NET AJAX


(body)
(asp:ScriptManager ID="ScriptManager1" runat="server" /)
(asp:UpdatePanel ID="UpdatePanel1" runat="server")

(asp:Button ID="Button1" runat="server"
Text="Do something" OnClick="WaitFiveSeconds"
OnClientClick="$get('Button2').style.display='';" /)(br /)
(asp:Button ID="Button2" runat="server"
Text="Abort postback" Style="display:none;" /)
(asp:Label ID="Label1" runat="server" /)

(/asp:UpdatePanel)
(asp:UpdateProgress ID="UpdateProgress1" runat="server"
AssociatedUpdatePanelID="UpdatePanel1")

Loading, please stand by ...



(/asp:UpdateProgress)

(/body)
.



Оцените статью: (0 голосов)
0 5 0

Статьи из раздела ASP.NET AJAX на эту тему:
Обновление части страницы
Обновление части страницы через определенные интервалы времени
Отображение экранной заставки в период ожидания
Программное обновление части страницы через определенные интервалы времени
Создание обновляемой области страницы