• Microsoft .NET
  • ASP.NET
  • Обмен информацией между страницами с содержимым (Content Pages) и мастер–страницами (Master Pages)

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

ОГЛАВЛЕНИЕ

При использовании Microsoft ASP.NET AJAX Framework и UpdatePanel (свойство ChildrenAsTriggers  которого  по умолчанию установлено в True "Истина"),  в случае, если находящийся в пределах UpdatePanel элемент интерфейса  вызывает полноценный постбэк, вместо него производится частичный постбэк. Например, при нажатии на элемент управления Button (кнопка) или при выборе какого-то другого значения в элементе управления DropDownList (Выпадающий список), свойство которого AutoPostBack установлено в значение True ("Истина"), обычно вызывается полноценный постбэк. Однако, если данные элементы находятся в UpdatePanel, то взамен вызывается частичный постбэк. Но что произойдет, если вызванный частичный постбэк затянулся, и пользователь опять вызовет частичный постбэк? Или что произойдет, если во время этой паузы он нажмет на какую-то другую кнопку в UpdatePanel и тем самым вызовет выполнение второго частичного постбэка?

Если частичный постбэк был вызван из того же UpdatePanel в то же самое время как другой частичный постбэк уже был вызван и выполняется, то постбэк, который вызвали первым, прекращается, и начинается выполнение второго постбэка. Прекращение частичного постбэка означает, что ASP.NET AJAX Framework в браузере уже не ожидает ответа с сервера на отосланный запрос. Оно не останавливает обработку на сервере и не производит откат изменений состояния, которые могли произойти на сервере. Следовательно, если при частичном постбэке добавляются записи в базу данных или выполняются какие-либо другие изменения, для которых пользователь нажимает какую-то кнопку в UpdatePanel, тем самым вызывая частичный постбэк, а затем повторно нажмет ту же самую кнопку во время выполнения первого постбэка, то в базу данных будут добавлены две одинаковые записи.

Существует несколько путей предотвращения такого двойного вызова частичного постбэка. Самым эффективным способом, по-моему, является "блокировка" области путем прикрытия экрана элементом <div>. (Рассмотрите последний пример в статье "Предоставляем визуальный фидбэк с помощью элемента управления UpdateProgress".) Другим вариантом является отключение элемента пользовательского интерфейса, вызвавшего частичный постбэк во время выполнения другого постбэка. Это предотвратит повторный вызов частичного постбэка. Читайте далее, чтобы больше узнать об этом!