Итак, запись в таблице отредактирована, осталось её сохранить.
Первое, что приходит на ум - это целиком AJAX решение, когда данные
собираются из редактируемой строки DataGrid, отправляются на сервер,
и в случае успеха клиентская PostBack функция перерисовывает строку
таблицы уже только для просмотра. Однако, если первая часть этой
идеи не вызывает никаких трудностей, то перерисовка таблицы ставит
несколько вопросов. Во-первых, для общего случая нужно найти способ
получить с сервера представление
ItemTemplate
каждого элемента управления в редактируемой строке, т.е. как
отображаются колонки в режиме просмотра. Далее полученным с сервера
данным вместе с представлением найти соответствующие места на
странице куда всё это вставить. И произвести вставку.
Как
альтернативный вариант, можно попробовать собрать на сервере всю
строку таблицы, найти на клиенте её место на странице и вставить.
Даже если найти способ всё это сделать относительно небольшим
количеством кода, остается следующий вопрос. Что делать с состоянием
страницы, ведь ViewState страницы хранит другие данные и при первом
же PostBack (например, в случае фильтрации или сортировки), таблица
всё еще будет считать, что определенная строка находится в состоянии
редактирования, а значения элементов "поднимутся" из ViewState
старые. "Достучаться" до объектной модели не возможно, так как при
асинхронном вызове, объектная модель страницы не инициализирована, а
значит AJAX метод ничего не знает о существующих в жизненном цикле
страницы объектах.
Теоретически, можно поступить как это делает ASP .NET 2, а
именно инициализировать почти все шаги жизненного цикла, кроме
Render. Далее изменить объекты страницы на новые и это гарантирует,
что при следующем обращении к странице мы получим ожидаемый
положительный результат. При таком решении есть два значительных
минуса: для достаточно простого логического действия, отрисовки
строки таблицы, приходится писать много кода, и при этом нагрузка на
сервер остается на том же уровне, что и при простом PostBack. По
сути, единственным плюсом становится то, что пользователь не видит
как перерисовывается вся страница.
Пока что, на мой взгляд правильным решением будет вызов функции
__doPostBack
в клиентской CallBack функции.
Итак, при нажатии на клиенте кнопки Update, вызывается следующая
функция:
CODE
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);
}
В этом коде, нахождение элементов управления в строке по ID кнопки
является более универсальным, чем в предыдущих примерах. Находится
префикс, собираемый ASP.NET в зависимости от положения элемента
управления в тех или иных панелях, пользовательских "контролах" и
наконец, от номера редактируемой строки в таблице. Например,
ниспадающий список выбора офиса в редактируемой строке может
выглядеть так:
grdEquipment__ctl6_ddlstOffice,
что означает что он принадлежит таблице grdEquipment, строке _ctl6.
Но, в общем префикс может быть и длиннее.
В первой строке вышеприведенной функции с сервера получаем
структуру для дальнейшего заполнения её данными и отправки на
сервер. Т.е. фактически, получаем метаданные, на основе которых
формируем объект и отправляем его на сервер для сохранения. После
вызова серверного метода, управление передается клиентской функции:
CODE
function updateEq_callback(res) {
if(res.value.length > 0) alert(res.value); else {
__doPostBack("","LoadData");
}
}
При отсутствии ошибок, она реализует PostBack страницы.
Единственное, что примечательно в этом коде, это то что в качестве
параметра
eventArgument
отправляю флаг "LoadData", который интерпретирую в жизненном цикле
страницы как считывание актуальной информации из базы данных. В
противном случае, таблица бы заполнилась данными из старого
ViewState или из устаревшей сессии, что при обновлении неверно. Вот,
пожалуй и всё.
Источник:
Vorant's Blog (
Блоги на Realcoding.NET
)
|