Отслеживание состояния с использованием ASP.NET AJAX / ICallbackEventHandler

У меня проблема с поддержанием состояния на странице ASP.NET AJAX. Короткая версия: мне нужен какой-то способ обновить страницу ViewState после асинхронного обратного вызова, чтобы отразить любые изменения состояния сервера, сделанные во время асинхронного вызова.

Кажется, это общая проблема, но я опишу свой сценарий, чтобы помочь объяснить:

У меня есть элемент управления в виде сетки, который имеет некоторые улучшения JavaScript, а именно, возможность перетаскивать столбцы и строки. Когда столбец или строка помещаются в новую позицию, вызывается метод AJAX для уведомления стороны сервера управления и запуска соответствующего события на стороне сервера («OnColumnMoved» или «OnRowMoved»).

ASP.NET AJAX вызывает, по умолчанию, отправку всей страницы в качестве запроса. Таким образом, страница проходит полный жизненный цикл, состояние представления сохраняется, и состояние элемента управления восстанавливается до вызова метода RaiseCallbackEvent.

Однако, поскольку вызов AJAX не обновляет страницу, ViewState отражает исходное состояние элемента управления даже после перемещения столбца или строки. Таким образом, во второй раз, когда происходит действие на стороне клиента, AJAX-запрос отправляется на сервер, и страница и элемент управления восстанавливаются снова, чтобы отразить первое состояние элемента управления, а не состояние после перемещения первого столбца или строки.

Эта проблема распространяется на многие последствия. Например, если у нас есть действие на стороне клиента / AJAX для добавления нового элемента в сетку, а затем перетаскивается строка, сетка строится на стороне сервера с одним элементом меньше, чем на стороне клиента.

И, наконец, наиболее серьезно для моего конкретного примера, фактический объект источника данных, с которым мы работаем, хранится на странице ViewState. Это было конструктивное решение, позволяющее сохранять копию манипулированных данных с сохранением состояния, которые могут быть либо зафиксированы в БД после многих манипуляций, либо отброшены, если пользователь отступает. Это очень трудно изменить.

Итак, опять же, мне нужен способ обновления страницы ViewState при обратном вызове после запуска метода AJAX.

5.08.2008 13:52:12
5 ОТВЕТОВ
РЕШЕНИЕ

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

2
7.08.2008 16:19:34

Проверьте это сообщение в блоге: настройка ICallbackEventHandler и Viewstate . Автор, похоже, обращается к той самой ситуации, с которой вы столкнулись:

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

Смотрите в блоге его предложения о том, как решить эту проблему. Также ознакомьтесь с этим сообщением на форуме, где также обсуждается та же проблема.

1
5.08.2008 14:25:19

Я действительно нашел обе ссылки, которые вы предоставили, но, как уже было отмечено, они просто описывают проблему, а не решают ее. Автор поста в блоге предлагает обходной путь с использованием другого поставщика ViewState, но, к сожалению, в данном случае это невозможно ... Мне действительно нужно оставить детали ViewState в покое и просто подключиться к тому, что делается вне коробки.

0
5.08.2008 14:54:23

Я нашел довольно элегантное решение с RadAjaxManager Telerik . Он работает довольно хорошо, по сути вы регистрируете каждый элемент управления, который может вызвать обратную передачу, а затем регистрируете каждый элемент управления, который должен быть перерисован после того, как эта обратная передача выполняется асинхронно. RadAjaxManager обновит DOM после асинхронной обратной передачи и перепишет ViewState и все затронутые элементы управления. Взглянув на Reflector, он выглядит немного сумрачно под капотом, но он подходит для моих целей.

0
8.08.2008 04:18:51

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

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

0
8.08.2008 04:56:31