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

StackOverflow https://stackoverflow.com/questions/2328

Вопрос

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

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

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

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

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

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

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

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

Это было полезно?

Решение

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

Другие советы

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

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top