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. Передача параметров между страницами возможна через: Прямая установка параметров процессов, сессия пользователя, адресная строка, клиентские объекты