[ главная ]   [ рейтинг статей ]   [ справочник радиолюбителя ]   [ новости мира ИТ ]



Ответов: 0
25-02-12 07:01







   Web - программирование
PHP


ASP






XML



CSS

SSI





   Программирование под ОС











   Web - технологии








   Базы Данных









   Графика






Данные




Web - программирование / AJAX /

AJAX. Взаимодействие с жизненным циклом страницы

Итак, запись в таблице отредактирована, осталось её сохранить. Первое, что приходит на ум - это целиком AJAX решение, когда данные собираются из редактируемой строки DataGrid, отправляются на сервер, и в случае успеха клиентская PostBack функция перерисовывает строку таблицы уже только для просмотра. Однако, если первая часть этой идеи не вызывает никаких трудностей, то перерисовка таблицы ставит несколько вопросов. Во-первых, для общего случая нужно найти способ получить с сервера представление<!--coloro:#000099--> <!--/coloro-->ItemTemplate<!--colorc--><!--/colorc--> каждого элемента управления в редактируемой строке, т.е. как отображаются колонки в режиме просмотра. Далее полученным с сервера данным вместе с представлением найти соответствующие места на странице куда всё это вставить. И произвести вставку.

Как альтернативный вариант, можно попробовать собрать на сервере всю строку таблицы, найти на клиенте её место на странице и вставить. Даже если найти способ всё это сделать относительно небольшим количеством кода, остается следующий вопрос. Что делать с состоянием страницы, ведь ViewState страницы хранит другие данные и при первом же PostBack (например, в случае фильтрации или сортировки), таблица всё еще будет считать, что определенная строка находится в состоянии редактирования, а значения элементов "поднимутся" из ViewState старые. "Достучаться" до объектной модели не возможно, так как при асинхронном вызове, объектная модель страницы не инициализирована, а значит AJAX метод ничего не знает о существующих в жизненном цикле страницы объектах.

 Теоретически, можно поступить как это делает ASP .NET 2, а именно инициализировать почти все шаги жизненного цикла, кроме Render. Далее изменить объекты страницы на новые и это гарантирует, что при следующем обращении к странице мы получим ожидаемый положительный результат. При таком решении есть два значительных минуса: для достаточно простого логического действия, отрисовки строки таблицы, приходится писать много кода, и при этом нагрузка на сервер остается на том же уровне, что и при простом PostBack. По сути, единственным плюсом становится то, что пользователь не видит как перерисовывается вся страница.

  Пока что, на мой взгляд правильным решением будет вызов функции <!--coloro:#000099--> <!--/coloro-->__doPostBack<!--colorc--><!--/colorc--> в клиентской CallBack функции.
Итак, при нажатии на клиенте кнопки Update, вызывается следующая функция:
<!--c1-->

CODE
<!--ec1-->function updateEq(controlID) {
          var _eqInfo = AdminEditor.EqEditor.GetEqInfoMetaData().value;

          var lastind = controlID.lastIndexOf('_');
          var prefix = controlID.substring(0, lastind + 1);
          
          _eqInfo.DepartmentID    = document.getElementById(prefix + "ddlstDepartment").value;          
          _eqInfo.DeviceModelID = document.getElementById(prefix + "ddlstDevicemodelID").value;          
          _eqInfo.OfficeID        = document.getElementById(prefix + "ddlstOffice").value;          
          _eqInfo.RoomID        = document.getElementById(prefix + "ddlstRoom").value;          
          _eqInfo.InvNumber        = document.getElementById(prefix + "txtInvNumber").value;          
          _eqInfo.Comment        = document.getElementById(prefix + "txtComment").value;
          tmp                    = document.getElementById(prefix + "txtComissDate").value;
          if(tmp.length > 0) {
            arr = tmp.split(".");
            _eqInfo.ComissDate = new Date(arr[2], arr[1]-1, arr[0]);
          }
          _eqInfo.Discarded     = document.getElementById(prefix + "chkDiscardedE").checked;
          
          var deviceID = document.getElementById(prefix + "deviceID").value;
          AdminEditor.EqEditor.UpdateEq(deviceID, _eqInfo, updateEq_callback);

        }<!--c2-->
<!--ec2-->
В этом коде, нахождение элементов управления в строке по ID кнопки является более универсальным, чем в предыдущих примерах. Находится префикс, собираемый ASP.NET в зависимости от положения элемента управления в тех или иных панелях, пользовательских "контролах" и наконец, от номера редактируемой строки в таблице. Например, ниспадающий список выбора офиса в редактируемой строке может выглядеть так:<!--coloro:#000099--> <!--/coloro--> grdEquipment__ctl6_ddlstOffice<!--colorc--><!--/colorc-->, что означает что он принадлежит таблице grdEquipment, строке _ctl6. Но, в общем префикс может быть и длиннее.
  В первой строке вышеприведенной функции с сервера получаем структуру для дальнейшего заполнения её данными и отправки на сервер. Т.е. фактически, получаем метаданные, на основе которых формируем объект и отправляем его на сервер для сохранения. После вызова серверного метода, управление передается клиентской функции:
<!--c1-->
CODE
<!--ec1-->        function updateEq_callback(res) {
            if(res.value.length > 0) alert(res.value); else {
                __doPostBack("","LoadData");
            }
        }<!--c2-->
<!--ec2-->
При отсутствии ошибок, она реализует PostBack страницы. Единственное, что примечательно в этом коде, это то что в качестве параметра<!--coloro:#000099--> <!--/coloro--> eventArgument<!--colorc--><!--/colorc--> отправляю флаг "LoadData", который интерпретирую в жизненном цикле страницы как считывание актуальной информации из базы данных. В противном случае, таблица бы заполнилась данными из старого ViewState или из устаревшей сессии, что при обновлении неверно. Вот, пожалуй и всё.

Источник: Vorant's Blog ( Блоги на Realcoding.NET )




Комментарии

 Ваш комментарий к данному материалу будет интересен нам и нашим читателям!



Последние статьи: Web - программирование / AJAX /

Asynchronous JavaScript and XML
06-12-2009   

Когда существующих возможностей становиться мало, а совершенствовать существующее уже некуда, тогда и происходит технологический прорыв. Таким прорывом и есть AJAX (Asynchronous JavaScript and XML) - подход к построению пользовательских интерфейсов веб-приложений, при котором web-страница, не перезагружаясь, сама догружает нужные пользователю данные. AJAX - один из компонентов концепции DHTML... подробнее

Кол. просмотров: общее - 3220 сегодня - 1

AJAX. Взаимодействие с жизненным циклом страницы
06-12-2009   

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

Кол. просмотров: общее - 3225 сегодня - 0

xAJAX: Легкий AJAX в массы
03-12-2009   

Не так давно я говорил, что буду предоставлять информацию относительно PHP и Ajax. На конференции которую я провел на прошлой неделе 10 ноября 2005г. Я также обещал людям что переведу все что я приготовил для публикации на моем блоге (автор так и не перевел все это дело на Голландский, тем самым очень мне облегчил перевод )... подробнее

Кол. просмотров: общее - 3374 сегодня - 1

«Hello, закладки!» - Добавить в закладки на AJAX
03-12-2009   

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

Кол. просмотров: общее - 238065 сегодня - 0

Simple AJAX Code-Kit (SACK) и движок DataLife
03-12-2009   

Рыская в интернете в поисках Ajax-готового новостного движка, я наткнулся на давно всем известный . Хотя этот довольно продвинутый php ресурс и содержит элементы Ajax, они по-моему не до конца раскрыты и используются довольно скупо... подробнее

Кол. просмотров: общее - 3449 сегодня - 1



  WWW.COMPROG.RU - 2009-2012 | Designed and Powered by Zaipov Renat | Projects