Россия, Каменск-Уральский |
Применение Веб-методов. Технология Jasp
14.2.6. Передача данных на клиентскую сторону
Для передачи данных на клиентскую сторону, на сервере можно использовать словарь Data, который есть у каждого компонента. Все значения, записанные в этот словарь, будут доступны на клиентской стороне в виде JSON -объекта в свойстве $data.
Например, записав при загрузке текущую дату:
protected override void OnLoad() { Data["serverTime"] = DateTime.Now; }
До нее можно с легкостью добраться на клиентской стороне:
{ $init: function() { alert(this.$data.serverTime); } }
Данную методику можно использовать только в момент загрузки компонента, как при загрузке страницы, так и при его отложенной загрузке через JavaScript.
Если на клиентской стороне необходимо получить/отправить данные в произвольный момент, можно воспользоваться удаленным вызовом функции (RPC). Все методы компонента, помеченные атрибутом RpcMethodAttribute, можно вызывать удаленно.
Пример таких методов представлен ниже. Остается отметить, что такие методы, по сути, являются методами Веб-сервисов, для которых созданы прокси-классы в JavaScript:
public class MyUserControl : UserControl { [JsonRpcMethod] public Person GetPersonById(int personId) { // возвращаем Person } [JsonRpcMethod] public void SavePerson(Person person) { // сохраняем Person } }
Перегрузка функций поддерживается только по количеству параметров. По типу параметров перегрузка не поддерживается. В качестве параметров или возвращаемого значения могут быть произвольные объекты, которые впоследствии будут отформатированы в JSON -объекты.
14.2.7. Наследование компонент и страниц
Jasp поддерживает наследование компонент как на серверной стороне, так и на клиентской. У компонента наследуются все ресурсы от базового. С помощью наследования, можно, например, делать страницы, содержащие базовую разметку (по аналогии с MasterPage в ASP.NET ), но также и отдельные компоненты, которые содержат часть базовой разметки и могут быть использованы для производных компонент.
Для наследования компонент, достаточно унаследовать серверный класс. При этом все ресурсы компонента (разметка, стили и скрипты) будут дополнять или замещать ресурсы базового компонента.
14.2.7.1. Наследование разметки
По умолчанию, HTML разметка копируется от базового компонента. Но благодаря специальному тегу <replacement> можно заменять или удалять базовые компоненты. Например, у нас есть базовая разметка:
<body> <div id="div1">Первоначальный текст </div> </body>
И производная разметка:
<replacement id="div1"> <div id="div2">Переопределенный текст</div> И другой текст </replacement>
При копировании разметки из базового компонента, вместо элемента с идентификатором div1 будет подставлена замена из тега replacement с одноименным идентификатором.
14.2.7.2. Наследование стилей
При добавлении CSS ресурса к наследуемому компоненту, Jasp будет добавлять его сразу после CSS ресурса родительского компонента. Тем самым, если создавать одноименные стили – они будут переопределяться. Данная практика наследования хорошо работает со стилями страницы, но при работе с компонент возникают проблемы – стили затираются и для родительского компонента, который может быть размещен на этой же странице, что неявно изменит его внешний вид. Решение для таких случаев – это создание стилей с другими именами.
14.2.7.3. Наследование JavaScript
Наследование JavaScript в Jasp реализовано через прототипы. Оно очень похоже на классическое наследование в объектно-ориентированном программировании (ООП). При определении новых методов, они будут переопределять родительские. В новом методе можно вызвать базовый метод. Например, JavaScript базового компонента:
{ hi: function() { alert('Базовый привет!'); } }
И производного:
{ hi: function() { alert('Привет!'); BaseFooControl.prototype.call(this); } }
Для библиотек, которые поддерживают наследование через прототипы (например, ExtJS) можно задать базовый класс для компонента из библиотеки с помощью атрибута ClientBaseAttribute:
[ClientBase("Ext.Window")] public class FooControl : UserControl { //.... public FooControl(int fooId) { // подгружаем необходимые данные } }
Клиентский код:
{ onFooButtonClick: function() { // Создаем FooControl // происходит вызов серверного конструктора – в нем можно подгрузить необходимые данные // и вызов $init – в нем инициализировать окно, подставить загруженные данные var fooControl = new FooControl({ arg: [1] // параметры конструктора }); // Показываем окно (метод show наследован из ExtJs) fooControl.show(); } // ... }
Благодаря этому, компонент на Jasp будет являться одновременно и компонентом ExtJS (либо другой библиотеки). Чтобы не было конфликтов с другими библиотеками, каждое свойство или функция на клиентской стороне начинается с $. Так, например, удается избежать конфликтов идентификаторов ( id ) или часто распространенных имен функций ( init ).
14.2.8. Конфигурирование Jasp
Jasp конфигурируется с помощью собственной секции в файле web.config.
Также необходимо добавить HttpHadler и WebServer Hadler, чтобы ASP.NET начал обрабатывать запросы Jasp. Если параметры не определены, Jasp конфигурируется в зависимости от конфигурации сборки. Если сборка Jasp собрана в Debug режиме, параметры оптимизированы для отладки, если сборка собрана в Release режиме, то параметры оптимизированы для производительности. В табл. 11.3 перечислены параметры конфигурации, которые поддерживает Jasp.
Параметр resourceFilter определяет класс, экземпляр которого будет заниматься фильтрацией текстовых ресурсов. Если нам нужно как-то отформатировать текстовый ресурс, например, удалить лишние пробелы или подменить ссылки, то можно создать класс, наследованный от класса Jasp.Resources.ResourceFilter и переопределять метод Filter(string name, StringBuilder data). Отфильтрованный ресурс впоследствии кэшируется. Для примера, переопределив этот параметр, можно производить замену путей в CSS-файлах библиотеки ExtJS автоматически, чтобы при обновлении этих файлов ничего не забыть.
Параметр exceptionFormatter используется для указания класса, экземпляр которого форматирует исключение при RPC-вызовах в JSON -объект. Если вам необходимо при возникновении исключения выводить дополнительные данные, например лог nHibernate, то это без труда можно сделать, переопределив метод Format класса Jasp.Web.ExceptionFormatter.
Узнав, что все ресурсы в Jasp должны быть embedded resource, многие думают, что для вступления в силу изменений в HTML, CSS или в JavaScript необходимо перекомпиляция проекта. За это отвечает параметр watchResources. Если он установлен в True, то Jasp следит за ресурсами, и при изменении автоматически их "подхватывает".
14.2.9. Ключевые термины
Jasp, .NET Framework, ASP.NET, jQuery, Ресурсы, Страницы, Компоненты, JSON, Наследование.
14.3. Краткие итоги
Веб-службы можно создавать, используя архитектуру ASP.NET, что позволяет им использовать разнообразную функциональность платформы.
При работе с Веб-сервисами существуют две фундаментальные роли:
ASP.NET позволяет создавать Веб-сервисы, к которым можно обращаться из клиентского сценария страниц.
Страницы взаимодействуют с сервером посредством уровня связи, использующего технологию AJAX для вызова Веб-служб.
Обмен данными между клиентом и сервером осуществляется асинхронно, как правило, в формате JSON.
Существует два подхода к вызовам методов Веб-сервиса:
- с помощью команды POST HTTP ;
- с помощью команды GET HTTP.
Основные элементы уровня связи Веб-служб:
Элементы серверной архитектуры AJAX включают:
- пользовательские Веб-службы ;
- методы страниц ;
- службу проверки подлинности;
- службу ролей;
- службу профилей;
- JSON - сериализацию ;
- XML- сериализацию.
Веб-сервисы создаются в управляемом коде с помощью платформы ASP.NET:
- при помощи класса WebRequest;
- с помощью использования прокси-классов.
Jasp является библиотекой для разработки Веб-приложений с использованием платформы Microsoft .NET Framework.
Основным отличием Jasp от ASP.NET является ориентация библиотеки на клиентскую сторону, чтобы программисту было проще создавать "богатый" пользовательский интерфейс в первую очередь средствами языка JavaScript, CSS и в последнюю очередь HTML, сгенерированным на стороне сервера.
При загрузке страницы, Jasp определяет, какие ресурсы используются на странице:
Для создания страницы, необходимо создать класс, наследующий от класса Jasp.Web.UI.Page.
Для создания компонент, необходимо создать класс, наследованный от класса Jasp.Web.UI.UserControl.
Экземпляры компонент могут создаваться:
Для передачи данных на клиентскую сторону, на сервере можно использовать словарь Data, который есть у каждого компонента.
Jasp поддерживает наследование компонент, как на серверной стороне, так и на клиентской.
Jasp конфигурируется с помощью собственной секции в файле web.config.