Сценарий открытия страницы редактирования со списка
Адрес страницы редактирования определяется настройкой 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-форму, при необходимости, заполняются поля выбранного мастера.