5. Механизмы общения между страницами

advertisement
5. Механизмы общения между
страницами
Задача
Методология
Работа с экземплярами
Работа страниц приложения в
1
классов встроенных
рамках одной ASP страницы
процессов страниц (C#)
Взаимодействие страниц
Работа с ссылками на
2 приложения находящихся на клиентское представление
разных ASP страницах
страниц (JavaScript)
Примеры реализации
Построение стандартного раздела
BaseModulePage
Базовая карточка редактирования
BaseEditPage, страница выбора из
справочника LookupGridPage
Пример 1
Реализовать две страницы которые будут передавать сообщения и параметры организовывая чат
в рамках одной ASP страницы
Реализуем страницу чата, которая содержит интерфейс ввода и отправки сообщения
в процессе страницы добавим параметры
все параметры имеют тип строка. UserName - имя пользователя который работает в этой
странице, ListenerPageProcessUId - идентификатор процеса страницы куда отправляется
сообщения, Message - текст сообщения которое передаётся извне.
Для обработки действий добавим два метода
Приём сообщения
void RecieveMessage(){
Page.ChatEdit.Text += string.Format("{0}", Message);
}
Отправка сообщения в другую страницу
void SendMessage(){
var process =
UserConnection.ProcessEngine.GetProcessByUId(ListenerPageProcessUId);
string userName = process.GetPropertyValue("UserName").ToString();
string message = string.Format(" {0}:\t{1}, {2}\r\n", UserName, userName,
Page.TextEdit.Text);
Page.ChatEdit.Text += message;
process.SetPropertyValue("Message", message);
process.ThrowEvent(process.InternalContext, "RecieveMessage");
}
переменная process содержит ссылку на экземпляр процесса страницы с которой мы хотим
общаться, и используются основные методы работы с процессом: получение/установка значения
параметра процесса по имени параметра, генерация заданного сообщения в процессе.
Для завершения работы над страницей необходимо добавить обработку нажатия кнопки и события
"RecieveMessage" в процессе страницы
где в сценариях вызвать методы процесса SenMessage() и RecieveMessage() соответсвенно
Для завершения примера, необходимо добавить страницу контейнер, которая будет содержать
две ранее разработанных страницы и связывать их между собой.
В процессе этой страницы необходимо выполнить связку дочерних страниц между собой
добавив в сценарий следующий код
Page.LeftPageContainer.PageInstance.Process.SetPropertyValue("UserName", "Alice");
Page.LeftPageContainer.PageInstance.Process.SetPropertyValue("ListenerPageProcessUId",
Page.RightPageContainer.PageInstance.Process.InstanceUId);
Page.RightPageContainer.PageInstance.Process.SetPropertyValue("UserName", "Bob");
Page.RightPageContainer.PageInstance.Process.SetPropertyValue("ListenerPageProcessUId"
,
Page.LeftPageContainer.PageInstance.Process.InstanceUId);
return true;
который установит имена пользователей от которых будут отсылаться сообщения и
инициализирует ключи процессов страниц для их дальнейшего общения.
Ссылки на пример: Страница чата, Страница контейнер
Пример 2
Реализовать общение между страницами чата из Примера 1 расположенными на разных ASP
страницах.
Для начала изменим страницу контейнер, удалив из неё контейнеры страниц и добавив кнопку
вызова новой страницы и многострочное поле для отображения сообщений переданных из
открытой страницы.
В процессе страницы контейнера добавим вызов нового окна которое отобразит страницу чата,
отменим обработку события PageLoadComplete и добавим обработку сообщения RecieveMessage
код сценариев выглядит следующим образом
RecieveMessage
var msg = (context.ThrowEventArgs as Dictionary<string,
object>)["message"].ToString();
Page.MemoEdit.Text += string.Format("{0}", msg);
return true;
CallButtonClick
var pageUId =
UserConnection.GetSchemaManager("PageSchemaManager").GetItemByName("ChatPage").UId;
//pageUId = new Guid("b3dcedac-03b4-41b5-878e-792033987c17");
//pageUId = ChatConsts.ChatPageSchemaUId;
OpenPageUserTask.PageUId = pageUId;
OpenPageUserTask.UseCurrentActivePage = true;
OpenPageUserTask.OpenerInstanceId = InstanceUId;
OpenPageUserTask.PageParameters = new Dictionary<string, string> {
{"userName", "Bob"},
{"senderName", "Alice"},
{"listenerPageProcessUId", OpenPageUserTask.OpenerInstanceId}
};
return true;
где устанавливается идентификатор страницы которая будет открыта, варианты получения могут
быть разными установка константы (не рекомндуется), использования менеджера страниц (как в
данном случае), или методом объявления статического класса с константой, которая имеет
логическое название (этот метод рекомендуется использовать для всех случаев когда необходимо
воспользоваться определённым значение идентификатора), также идёт передача параметра
идентификатора процесса страницы чата, расположенного на странице и передача имени
пользователя, которым будет инициализирована страница чата в новой ASP страницы.
Теперь необходимо изменить процесс страницы чата, изменив методы приёма и получения
сообщений
в скрипте обработки PageLoadComplete инициализируем свойства имя пользователя и имя
звонящего
if (Page.GetParameterValue("userName") != null) {
UserName = Page.GetParameterValue("userName").ToString();
}
if (Page.GetParameterValue("senderName") != null) {
SenderName = Page.GetParameterValue("senderName").ToString();
}
if (Page.GetParameterValue("listenerPageProcessUId") != null) {
ListenerPageProcessUId =
Page.GetParameterValue("listenerPageProcessUId").ToString();
}
return true;
Метод Page.GetParameterValue предоставляет универсальный доступ к параметрам которые
передаются в страницу в адресной строке или через сессию пользователя,
Теперь надо изменить методы отправки сообщений SendMessage в странице чата
string message = string.Format(" {0}:\t{1}\r\n", UserName, Page.TextEdit.Text);
Page.ChatEdit.Text += message;
string msg = string.Format("{{message:{0}}}", Json.Serialize(message));
string script =
string.Format("Terrasoft.AjaxMethods.ThrowClientEventWithParameters(\'{0}\',
'RecieveMessage', {1});",
ListenerPageProcessUId, Json.Serialize(msg));
Page.AddScript(string.Format("window.opener.eval({0})", Json.Serialize(script)));
формируется текст сообщения message, формируется объект msg для передачи сообщения на
клиенте, вызывается метод в контексте окна родителя window.opener.eval
Ссылки на пример: Ссылка на Страница чата, Страница контейнер
Итоги
1. Передача сообщений между страницами в рамках одной ASP страницы осуществляется
доступом к экземплярам процессов страниц
2. Передача сообщений между разными ASP страницами возможна только методами
регистрации клиентского кода
3. Передача параметров между страницами возможна через: Прямая установка параметров
процессов, сессия пользователя, адресная строка, клиентские объекты
Download