Сценарий открытия страницы редактирования со списка

Адрес страницы редактирования определяется настройкой WebObjectListView.EditPage. На страницу посылаются параметры через адресную строку:

Страница редактирования наследуется от 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 передается адрес web-контрола, с которого он был инициирован (страница, а также местоположение самого контрола). Также передается PrimaryKey выбранного объекта (если такой был на момент открытия LookUp’a) для подсветки его на открываемой странице.

Сценарий выбора значения мастера на LookUp-странице

При выборе какого-либо объекта на списке LookUp-страницы происходит возврат PrimaryKey этого объекта по адресу, отправленному при открытии LookUp-страницы.

После возврате значения на списковую web-форму, при необходимости, заполняются поля выбранного мастера.