Коллеги,
Хакинг BPMonline продолжается и его невозможно остановить. Кто ещё не знает, вы можете подписаться на клиентское событие, предшествующее аналогичному серверному событию для какого-либо контрола. Достаточно одной строчки. Добавлять нужно на PageLoadComplete. Выглядит это так (обязательно со скобками и т.д.):
string script = @" function(){ //тело функции } ()";
Page.SomeControl.AjaxEvents.SomeEvent.OnClientEvent=script;
Зачем это нужно? Порядок запуска методов будет такой: ClientEventScript ->AJAX-> ServerPageInit -> ServerPageLoad -> ServerEventScript
И вы получаете уникальную возможность сделать что-то со страницей ещё до того, мы зайдем на сервер и его события Init и PageLoad. Например, вам нужно знать, была ли нажат кнопка сразу же на PageLoad после того, как она была нажата. Если вы сделаете флаг нажатия в ServerEventScript, то он будет установлен уже после того, как сработает Init, а если вы такой флаг добавите в клиентскую часть, то его можно вычитать на PageLoad и узнать, что кнопка была нажата(как передавать параметры между клиентом и сервером, расскажу отдельно). Кроме того, некоторая часть логики недоступна на сервере или её выставление на сервере будет ненужным-поздним.
Ниже пример, как это делается, а также кое-какие другие возможности.
string script = @" function(){
var savetofileparam = new Object();
savetofileparam.MenuItem = itemIndex;
var SaveMenuItemParams = Ext.util.JSON.encodeObject(savetofileparam, 3);
Terrasoft.AjaxMethods.ThrowClientEventWithParameters('" + InstanceUId + @"', 'SaveToFileCustomEvent',SaveMenuItemParams, {eventMask:{showMask:false}, isUpload: true} ); } ()";
Page.SaveFileButton.AjaxEvents.MenuItemClick.OnClientEvent=script;
Тут мы добавляем функцию на клик пункта меню у кнопки, а также кидаем другое событие, которому передаём параметры в виде JSON-словаря SaveMenuItemParams (itemIndex-номер пункта, это передаётся в параметрах события, я узнал это опытным путём, у каждого клиентского события свои параметры). Также передаём параметры showMask и isUpload именно на клиенте, так как на сервере их передача не приводит к желаемому эффекту, потому что вычитываются они ранее ещё на клиенте. 'SaveToFileCustomEvent' – это произвольный message-событие. Если событие с таким названием определить на сервере, то можно его перехватить и выполнить свой код, при этом вычитав параметры, которые были упакованы, вот так ():
Dictionarystring, object> SaveMenuItemParams = context.ThrowEventArgs as Dictionarystring, object>;
if (SaveMenuItemParams != null) {
if (SaveMenuItemParams.ContainsKey("MenuItem")) {
//код работы с SaveMenuItemParams["MenuItem"]
}
}