Сценарий открытия страницы редактирования со списка
Адрес страницы редактирования определяется настройкой WebObjectListView.EditPage. На страницу посылаются параметры через адресную строку:
Mode- режим открытия страницы, может бытьreadonly.ReturnUrl- адрес возврата, содержит не только адрес страницы, но и адрес WOLV, с которого была вызвана страница редактирования.DataObject- передается вместе с POST запросом (передается через Request.Form[“DataObject”]). Хранит в себе сериализованный в XML экземпляр нового объекта (подробнее см. статью Пример открытия web-формы редактирования с передачей объекта с частично заполненными полями).PK- первичный ключ редактируемого объекта.
PK не посылается, однако, при первом сохранении объекта (без возврата на страницу со списком), этот параметр появляется в адресной строке.Страница редактирования наследуется от BaseEditForm.
При загрузке страницы срабатывает несколько виртуальных методов BaseEditForm, которые можно переопределить на странице редактирования:
PreLoad()- метод вызывается самым первым в методеPage_Load().PrepareDataObject- подготовка объекта к выгрузке на страницу. В этом методе (на BaseEditForm) происходит вычитка объекта поPK, или десериализация из POST-запроса (XML). Не рекомендуется переопределять этот метод.PreApplyToControls()- метод вызывается перед “размазыванием” данных объекта по контролам страницы. На момент вызова этого метода объект уже вычитан из базы (либо при PostBack’e значения уже записаны в объект), можно совершить какие-то дополнительные манипуляции с объектом прежде чем его значения попадут на страницу.AfterApplyToControl()- метод вызывается после “размазывания” данных объекта по контролам страницы. На момент вызова этого метода все контролы на странице уже обновлены в соответствии с данными объекта. Также метод вызывается после сохранения объекта (подробнее см. ниже).PostApplyToControl()- вызывается сразу заAfterApplyToControls()PostLoad()- вызывается самым последним при загрузке страницы.
Сценарий сохранения объекта
Последовательность срабатывания методов при нажатии кнопки Сохранить:
- javaScript метод
saveBtnClickHandler(файл: ~\shared\script\jquery.icsEditForm.js)- Запуск ASP.NET валидаторов
- Запуск установленных прикладными разработчикаи обработчиков события сохранения
- Ручная отправка PostBack’а на сервер
- Серверный виртуальный метод
SaveBtn_Click- обработчик нажатия на кнопку сохраненияBaseEditForm.PreSave()- виртуальный метод, срабатывающий перед фактическим сохранением объекта. Возвращает значение типаbool, если возвращено значениеfalse, то объект не уйдет на сохранение.SaveObject()- виртуальный метод, в котором происходит непосредственно сохранение объекта. Не рекомендуется переопределять этот метод без вызова базового метода.PostSaveObject()- виртуальный метод, срабатывающий после сохранения объекта. На момент вызова метода объект уже попадает в базу, следовательно срабатывает бизнес-сервер обновления этого объекта и все изменения, происходящие с объектом в бизнес-сервере уже доступны. Сразу после вызова этого метода происходит “размазывание” данных объекта по контролам.AfterApplyToControls()- метод, описанный в блокеСценарий открытия страницы редактирования со списка.
- Если на момент вызова метода сохранения объект был новый (то есть его не было в базе), то происходит редирект на эту же самую страницу редактирования, но в адресную строку добавляется
PrimaryKeyобъекта.
После сохранения объекта в методе SaveObject на базовой форме редактирования (BaseEditForm) вызывается метод WebBinder-а ApplyDataToControls, в нем, для контролов, которые реализуют ISaveActionCompatible сбрасывается флаг IsSaveNow, ну и всем контролам, соответствующим полям объекта данных проставляются актуальные значения из объекта.
Если при сохранении возникло необработанное исключение (например выбрашенное в бизнес-сервере), выполнение метода SaveObject прервется, и метод WebBinder-а ApplyDataToControls не будет вызван.
В контролах не будет сброшен флаг IsSaveNow, это черевото тем, что групэдит не будет разбираться со статусами строк, соответствующих детейлам, и оставит у всех строк статус WGEStatus.None,
а клиентский код групедита не посылает детейлы с таким статусом обратно на сервер (он посылает только новые, отредактированные или удаленные), из-за чего, если после возникновения исключения пользователь ничего не менял в строках групэдита, и вновь отправил форму на сохранение, то у объекта данных не будет детейлов (они просто не будут отправлены с клиента).
Для решения этой проблемы базовая форма редактирования отлавливает исключения при сохранении объекта, и в случае их возникновения вызывает метод WebBinder-а ApplySavingFlagToSaveActionCompatibleControls, который сбросит флаг IsSaveNow у контролов реализующих ISaveActionCompatible, затем базовая форма редактирования пробрасывает исключение дальше. Внутри метода SaveObject это выглядит следующим образом:
try
{
ds.UpdateObject(ref dObj);
PostSaveObject();
}
catch
{
wb.ApplySavingFlagToSaveActionCompatibleControls(Controls, View, false);
throw;
}
Если в прикладном коде используется не технологическая, а прикладная базовая форма редактирования, переопределяющая метод SaveObject, обязательно нужно, чтобы подобный код обрабатывал исключения при сохранении объекта.
LookUp’ы
Сценарий открытия страницы со списком на LookUp
Настройки LookUp:
LimitFunction- ограничение, накладываемое на отображаемые на открываемой LookUp-странице данные.LookUpFormURL- адрес страницы, которая вызовается на LookUp. По умолчанию смотрит наLookUpForm.
LookUp = true;, а также должен происходить разбор передаваемых через адресную строку параметров. Подробнее см. LookUpFormПри открытии страницы на LookUp передается адрес web-контрола, с которого он был инициирован (страница, а также местоположение самого контрола). Также передается PrimaryKey выбранного объекта (если такой был на момент открытия LookUp’a) для подсветки его на открываемой странице.
Сценарий выбора значения мастера на LookUp-странице
При выборе какого-либо объекта на списке LookUp-страницы происходит возврат PrimaryKey этого объекта по адресу, отправленному при открытии LookUp-страницы.
После возврате значения на списковую web-форму, при необходимости, заполняются поля выбранного мастера.