Отслеживание состояния с использованием ASP.NET AJAX / ICallbackEventHandler - PullRequest
10 голосов
/ 05 августа 2008

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

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

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

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

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

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

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

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

Ответы [ 5 ]

1 голос
/ 07 августа 2008

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

1 голос
/ 05 августа 2008

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

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

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

0 голосов
/ 08 августа 2008

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

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

0 голосов
/ 08 августа 2008

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

0 голосов
/ 05 августа 2008

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...