• Microsoft .NET
  • ASP.NET
  • ASP.NET AJAX: Отключение пользовательского интерфейса во время выполнения частичного постбэка

ASP.NET AJAX: Отключение пользовательского интерфейса во время выполнения частичного постбэка - Необходимость в отключении пользовательского интерфейса во время выполнения частичного постбэка

ОГЛАВЛЕНИЕ

 

Необходимость в отключении пользовательского интерфейса во время выполнения частичного постбэка

Приведенное в конце данной статьи Приложение, которое вы можете загрузить, включает в себя демо-страницу, названную NoDisabling.aspx и демонстрирующую обычное поведение. Демо-страница состоит из элемента управления UpdatePanel, содержащего два веб-элемента управления Button (Кнопка). При первой загрузке страницы сессионная переменная (Session), названная NumberOfClicks, установлена в 0:

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
   If Not Page.IsPostBack Then
      Session("NumberOfClicks") = 0
   End If
End Sub

В обработчике события Click кнопки (Button) данная сессионная переменная инкрементируется и кнопка, которая была нажата, а также значение данной сессионной переменной отображаются в элементе Label, названном Results. Более того, оба обработчика события Click "спят" 5 секунд, что добавляет искусственную задержку при выполнении частичного постбэка. Данная задержка необходима для имитации реальной ситуации, когда необходимо некоторое количество времени, чтобы выполнить частичный постбэк. Обработчик события Click для элемента Button1 должен выглядеть следующим образом:

Protected Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button1.Click
   Session("NumberOfClicks") += 1

   Results.Text = String.Format("Button 1 was clicked... The Buttons have been clicked {0:d} times", Session("NumberOfClicks"))

   Thread.Sleep(5000)
End Sub

В статье "Осуществляем действия клиента в ответ на частичные постбэки" демонстрируется путь выполнения клиентского скрипта на различных этапах жизненного цикла частичного постбэка. Если вы еще не ознакомились с вышеназванной статьей, то я советую вам прочитать её перед дальнейшим чтением данной статьи. В статье я продемонстрировал путь создания журнала, записывающего события с клиентской стороны и  отображающего сообщение  всякий раз, как только клиентское событие  вызовет объект PageRequestManager. (который отображает сообщение каждый раз как клиентское события вызовет объект PageRequestManager.) Приложение с кодом включает в себя данную функциональность.

Чтобы увидеть данную необходимость в отключении пользовательского интерфейса во время частичного постбэка, откройте в вашем браузере страницу с примером. Нажмите на первую кнопку, чтобы вызвать частичный постбэк. Журнал событий отобразит следующие записи:

  • initializeRequest
  • beginRequest

Следующее событие – endRequest - не отобразится, если частичный постбэк был прекращен или  же пока не будет получен ответ с сервера. Во время частичного постбэка повторно нажмите первую кнопку. Это начнет второй частичный постбэк. На первой стадии второго частичного постбэка (initializeRequest) прекращается первый частичный постбэк. Данное поведение можно заметить, судя по записям в журнале событий, на следующем изображении. Заметьте, что первые два события - initializeRequest и beginRequest - были вызваны в 11:08:14 первичным нажатием на кнопку "Button 1". Двумя секундами позже я повторно нажал кнопку "Button 1". Это создало третью запись в журнале событий (initializeRequest), в 11:08:16. Поскольку первый постбэк был все еще в силе, он был автоматически прекращен. Четвертая запись журнала событий (endRequest) указывает на завершение первого частичного постбэка. Пятая запись (beginRequest) оповещает о второй стадии выполнения второго частичного постбэка.


Важно понять, что прекращение частичного постбэка останавливает ожидание ответа, но оно не останавливает обработку на сервере, а также не производит откат уже совершенных изменений. Это наглядно видно по результату, отображенному в элементе Results Label при завершении второго частичного постбэка. Несмотря на то, что первый частичный постбэк был прекращен, сессионная переменная (Session) была дважды инкрементирована.

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