Проектирование и разработка веб-приложений на основе технологий Microsoft

Технология ASP.Net AJAX

Разбить на страницы
Показывать лекцию целиком

Термин Ajax был введен в 2005 году в статье Jesse James Garrett. Первоначально он использовался для обозначения семейства взаимосвязанных технологий, реализующих различные формы удаленного исполнения сценариев. В наши дни все разновидности удаленных сценарных технологий обычно помечаются префиксом AJAX. Современные решения на базе AJAX для платформы Windows основаны на объекте XmlHttpRequest.

В AJAX-приложениях сочетаются два фактора. С одной стороны, приложение должно передавать пользователям свежие данные, полученные с сервера. С другой стороны, новые данные должны интегрироваться в существующую страницу без ее полного обновления.

Браузер обычно выдает новый запрос при отправке формы HTML, инициированной либо сценарием, работающим на стороне клиента, либо действием пользователя (скажем, щелчком на кнопке). Получив ответ, браузер заменяет старую страницу новой.

Основным фактором, заложенным в основу удаленного исполнения сценариев, является возможность выдачи внеполосных запросов HTTP. В данном контексте под внеполосным вызовом понимается запрос HTTP, который выдается за пределами встроенного модуля, обеспечивающего отправку форм HTTP Внеполосный вызов инициируется событием страницы HTML и обслуживается компонентом-посредником (proxy component). В новейших AJAX-решениях таким посредником является объект XmlHttpRequest ; в самых первых реализациях RS им был апплет Java

Данная технология построена на принципе выполнения запроса к серверу с использованием JavaScript и получению результата опять же, с помощью JavaScript, что позволяет избежать перегрузки страницы и следовательно имеет несколько неоспоримых преимуществ:

  • На сервер отправляются не все элементы страницы (точнее не их значения), а только те минимальные данные, которые необходимы для выполнения того или иного запроса и в ответ принимается не вся страница, а только необходимые данные, что позволяет уменьшить трафик в десятки (а иногда и в сотни) раз.
  • Не происходит перегрузка страницы в браузере и у пользователя создается впечатление, что все происходит на его компьютере.
  • Объектная модель браузера.

    Document Object Model (DOM) – это спецификация, стандартизированная W3C комитетом, которая является кроссплатформенной и описывает действия с самим документом, его структурой, HTML, XML и стилями. Как следует из названия, основой спецификации DOM являются объекты.

    Спецификация DOM (Document Object Model) определяет общий интерфейс обновления содержимого, структуры и стиля документов HTML и XML, не зависящий от языка и платформы. Стандарт DOM получил признание и был ратифицирован комитетом W3C, поэтому сейчас он поддерживается все большим количеством браузеров. DOM определяет стандартный набор объектов для представления элементов, образующих документы HTML и XML. Совокупность этих объектов образует стандартный интерфейс для работы с элементами страниц HTML, или на более общем уровне — документов XML.

    Следует заметить, что хотя первые работоспособные прикладные среды удаленного исполнения сценариев появились около десяти лет назад, ограниченная поддержка динамического изменения отображаемого документа в браузере тормозила массовое принятие таких технологий в масштабах отрасли. До сегодняшнего дня.

    Объект XMLHttpRequest

    Объект XmlHttpRequest впервые появился в Internet Explorer 5.0. Этот внутренний объект публикуется браузером для работы с его подсистемой исполнения сценариев. Сценарный код, входящий в клиентскую страницу (как правило, код JavaScript), обращается к объекту и использует его функциональность.

    Что касается функциональности (несмотря на префикс XML),объект XmlHttpRequest представляет собой компактную объектную модель для отправки сценарием обращений HTTP в обход браузера. Когда пользователь щелкает на кнопке отправки формы или выполняет любое действие, приводящее к вызову метода submit объекта form модели DOM, браузер вмешивается в происходящее и берет последующую отправку запроса HTTP под свой полный контроль. С точки зрения пользователя, отправка запроса работает по принципу "черного ящика" с единственным видимым результатом: на экране появляется новая страница. Клиентский код сценария не может управлять процессом размещения и результатом отправки запроса.

    Объект XmlHttpRequest дает возможность сценарному коду отправлять запросы HTTP и обрабатывать полученные ответы.

    Важно заметить, что этот объект не является стандартом W3C, хотя многое из его функциональности описано в спецификации "The DOM Level 3 Load and Save Specification". По этой причине его поведение может немного отличаться в различных браузерах. Но во всех браузерах он выполняет одну и ту же функциональность – он умеет посылать запросы к серверу и получать от него ответы. Как уже говорилось выше, данный объект не стандартизирован и создание его instance может отличаться в различных версиях, поэтому для "надежного" его создания лучше использовать код, который объединяет в себе создание instance в нескольких браузерах подобно коду ниже:

    var xmlHttp; 
      function createXMLHttpRequest()  
      { 
       if (window.ActiveXObject)  
       { 
        xmlHttp = new ActiveXObject("Microsoft.XMLHTTP"); 
       } 
       else if (window.XMLHttpRequest)  
       { 
        xmlHttp = new XMLHttpRequest(); 
       } 
      }

    XMLHttpRequest имеет ряд "стандартных" (стандартных в кавычках т.к. как писалось выше, данный объект не стандартизирован для всех браузеров) свойств и методов, которые позволяют данному объекту посылать запрос, проверять состояние запроса и получать результат выполнения запроса от удаленного сервера. Эти свойства и методы мы рассмотрим в следующих двух таблицах.

    В таблице 1 представлены "стандартные" свойства XMLHttpRequest

    Метод Описание
    abort() Прерывает текущий запрос
    getAllResponseHeaders() Возвращает все заголовки Response в виде ключ/значение
    getResponseHeader(header) Возвращает значение определенного заголовка
    open(method, url, asynch, username, password) Устанавливает состояние запроса к серверу. Первый параметр указывает метод запроса – PUT, GET, POST, второй – url запроса, третий (необязательный) – тип запроса (синхронный или асинхронный), четвертый и пятый (также необязательные) – для защищенных страниц
    send(content) Посылает запрос серверу
    setRequestHeader(header, value) Устанавливает значение определенного заголовка. Перед вызовом этого метода необходимо вызвать метод open

    Также XMLHttpRequest содержит ряд свойств, которые представлены ниже:

    Свойство Описание
    onreadystatechange Обработчик события, которое возникает при каждой смене состояния запроса
    readyState Состояние запроса. Доступны следующие значения: 0 – запрос неинициализирован, 1 – загрузка, 2 – загрузка окончена, 3 – interactive, 4 - complete
    responseText Ответ от сервера в виде строки
    responseXML Ответ от сервера в XML. Этот объект может быть обработан и проверен как DOM
    status Код статуса HTML.(например 200 – OK)
    statusText Название кода статуса HTML

    Бегло проглянув эти методы, несложно понять, какие методы достаточно вызвать, чтобы с помощью JavaScript получить какие-либо данные с сервера.

    Внеполосные вызовы из страниц ASP.NET

    Для веб-страницы, выдающей внеполосные вызовы, определяется одно или несколько триггерных событий, которые в результате обработки кодом JavaScript выдают запросы через объект .Триггерными событиями могут быть только события HTML, отслеживаемые реализацией DOM текущего браузера.

    Код JavaScript должен инициировать обращение к удаленному URL и управлять им, как показано в следующем фрагменте:

    <script type="text/javascript">
      function SendRequest(url, params) " {
       // Включение параметров в строку запроса
       var pageUrl - url + "?outofband-trueparam" + params;
       /' Инициализация объекта XmlHttpRequest
       var xmlRequest, e;
       try {
        xml Request = new XMLHttpRequest();
        catch(e) { try {
        xmlRequest = new ActiveXObject('Microsoft.XMLHTTP");
       }
       catch(e) { }
      }
      // Подготовка к отправке синхронного запроса 
      POST xmlRequest,ореп("POST". pageUrl. false); 
      xmlRequest.setRequestHeader("Content-Type", "application/x-www-form-urlencoded"); 
      xmlRequest.send(nul1);
      return xmlRequest;
     }
    </script>

    Функция в приведенном примере получает две строки — вызываемый URL и список параметров. Формат строки запроса никак не стандартизирован и может произвольно изменяться в каждой конкретной реализации.

    В нашем примере URL, заданный программистом, дополняется парой параметров. Первый параметр ( outof band в нашем примере) представляет собой логический флаг, который указывает, должен ли запрос обрабатываться пользовательской функцией обратного вызова. Располагая этой информацией, целевая страница сможет обеспечить правильную обработку запроса. Во втором параметре ( param в нашем примере) передаются входные параметры для кода, исполняемого на стороне сервера.

    Код страницы выглядит примерно так:

    <html xmlns="http://www.w3.org/1999/xhtml" > 
      <head runat="server">
        <title>Testing Out-of-band</title> 
      </head>
      <body>
        <form id="Forml" runat="server"> 
          <hl>Demonstrate Out-of-band Calls</hl> 
          <h2>%=Request.Url%></h2> 
          <hr />
     
          <asp:DropDownList runat="server" ID="EmployeeList" /> 
          <input id="Button1"  type="button" 
                 value="Go Get Data" onclick="MoreInfo()" /> 
          <hr />
          <span id="Msg" /> 
        </form> 
      </body> 
    </html>

    Класс программной логики ( code-behind class ) приведен в следующем листинге:

    public partial class _Default : System.Web.UI.Page
    { 
      protected void Page_Load(object sender, EventArgs e) 
      {
        if (IsOutOfBan())
        return; 
        if (!IsPostBack)
        PopulateList();
      }
    
      private bool IsOutOfBand()
      {
        if (Request.QueryString["outofband"] != null) 
        {
          String param = Request.QueryString["param"].ToString(); 
          Response.Write(ExecutePageMethod(param)); 
          Response.Flush(); 
          Response. End(); 
          return true:
        }
        return false;
      }
    
      private void PopulateList() 
      { 
        SqlDataAdapter adapter = new SqlDataAdapter(
            "SELECT employeeid, lastname FROM employees",
            "SERVER=(1ocal); DATABASE=northwind; UID=...;"); 
        DataTable table = new DataTable(); 
        adapter.Fill(table);
        EmployeeList.DataTextField = "lastname"; 
        EmployeeList.DataValueField = "employeeid"; 
        EmployeeList.DataSource = table; 
        EmployeeList.DataBind();
      }
      
      string ExecutePageMethod(string eventArgument) {
        return "You clicked: " + eventArgument;
      }
    }

    Код на стороне клиента

    Внеполосный вызов ASP.NET начинается с выполнения функции JavaScript, предоставленной системой. Как правило, эта функция связывается с обработчиком события уровня страницы — такого, как щелчок на кнопке или изменение выбранной строки в раскрывающемся списке. Для наглядности рассмотрим конкретный пример.

    Представьте веб-страницу, на которой отображается информация о работнике. Пользователь выбирает имя из списка и щелкает на кнопке, чтобы получить дополнительную информацию. Чтобы механизм внеполосного вызова успешно работал, кнопка не должна быть кнопкой отправки ( submit button ); в противном случае произойдет обычная отправка данных с полным обновлением страницы. Возьмем следующую разметку:

    <asp:DropDownList ID="cboEmployees" runat="server"
          DataTextField="lastname" DataValueFiel="employeeid" />
    <input type="button" runat="server" 
           id="buttonTrigger" value="More Info">

    Пользователь выбирает элемент из списка и щелкает на кнопке, чтобы получить дополнительную информацию. Обработчик события onclick кнопки добавляется динамически при обработке страницы на сервере. Такие вещи уместно делать при обработке события Page_Load:

    protected void Page_Load (object sender, EventArgs e) 
    {
      if (!IsPostBack) 
      {
        // Заполнение списка
        cboEmployees.DataSource = GetEmployeeList();
        cboEmployees.DataBind();
        // Построить средствами ASP.NET строку с функцией Javascript,
        // вызываемой для инициирования внеполосного вызова 
        string rpc = ClientScript.GetCallbackEventReference(
            this,
            "document.forms[0].elements['cboEmployees'].value",
            "UpdatePage",
            "null",
            "null",
            false);
        // Инициирование внеполосного вызова кнопкой 
        string js - String.Format("javascript:{0}". rpc): 
        buttonTrigger.Attributes["onclick"] = js:
      }
    }
    
    private Collection<Employee> GetEmployeeList()
    {
        ...
    }

    ASP.NET Script Callback предоставляет собственный JavaScript API для инкапсуляции всех необходимых обращений к XmlHttpRequest. Вместо этого следует направить все внимание на программный интерфейс метода GetCallbackEventReference объекта Page.ClientScript. Метод получает параметры, используемые при вызове, и возвращает строку с исходным кодом JavaScript, предназначенную для внедрения в страницу. Когда страница передается пользователю, кнопка, инициирующая внеполосный вызов, связывается со следующим сценарием:

    <input name="buttonTrigger" type="button" 
           id="button1" value="More Info"
           onclick="javascript:WebForm_DoCallback('__Page",
                       document.forms[0].elements['cboEmployees'].value, 
                       UpdatePage,null, null, false)" />

    сценарий хранится в ресурсах сборки и связывается со страницей при помощи динамически сгенерированной директивы включения сценария:

    <script src="/ProAspNetAdv/WebResource.axd?d=...t=..." type="text/javascript"></script>

    В странице, предоставленной пользователю, этот элемент располагается непосредственно за открывающим тегом .Не стоит и говорить, что вызывает объект и управляет запросом HTTP.

    Общие сведения о ASP.NET AJAX

    Возможности AJAX в ASP.NET позволяют быстро создавать веб-страницы с обогащенным пользовательским интерфейсом, содержащим известные элементы пользовательского интерфейса. К числу возможностей AJAX относятся библиотеки клиентских сценариев, включающие не зависящие от обозревателя технологии ECMAScript (JavaScript) динамического HTML (DHTML), также интеграцию с серверной платформой разработки ASP.NET. Используя возможности AJAX, можно улучшить пользовательский интерфейс веб-приложений и повысить их эффективность.

    Приложения с поддержкой AJAX обладают следующими достоинствами:

  • повышенная эффективность благодаря тому, что значительная часть обработки веб-страницы выполняется в обозревателе;
  • знакомые элементы пользовательского интерфейса, такие как индикаторы хода выполнения, подсказки и всплывающие окна;
  • частичное обновление страницы, при котором обновляются лишь отдельные части изменившейся веб-страницы;
  • интеграция клиента со службами приложения ASP.NET для проверки подлинности с помощью форм, управления ролями и пользовательскими профилями;
  • автоматически создаваемые прокси-классы, упрощающие вызов методов веб-службы из клиентского сценария;
  • структура, позволяющая настраивать серверные элементы управления для включения клиентских возможностей;
  • поддержка наиболее популярных и распространенных обозревателей, включая Microsoft Internet Explorer, Mozilla Firefox и Apple Safari.
  • Архитектура возможностей AJAX в ASP.NET

    Архитектура возможностей AJAX в ASP.NET состоит из двух частей: библиотек клиентских сценариев и серверных компонентов. Благодаря интеграции этих двух частей образуется надежная структура разработки.

    (рис 9.1) Клиентская и серверная архитектуры ASP.NET AJAX

    Иллюстрация демонстрирует функциональность клиентской Microsoft AJAX (библиотека), включающей поддержку создания клиентских компонентов, совместимость с обозревателями, сетевые и базовые службы. Также в примере показана функциональность серверных элементов AJAX, включая поддержку сценариев, веб-службы, службы приложения и серверные элементы управления. В следующих разделах эти возможности описаны более подробно.

    Клиентская архитектура технологии AJAX

    Клиентская архитектура включает библиотеки для поддержки компонентов, совместимость с обозревателями, сетевые средства и базовые службы

    Компоненты

    С помощью клиентских компонентов реализуется обогащенный пользовательский интерфейс в обозревателе без операций обратной передачи. Компоненты делятся на три категории:

  • невизуальные объекты, инкапсулирующие код, как объект, представляющий таймер;
  • поведения, расширяющие базовое поведение существующих элементов DOM;
  • Элементы управления, представляющие новый элемент DOM, обладающий пользовательским поведением.
  • Тип используемого компонента зависит от требуемого типа клиентского поведения. Например, водяной знак в существующем текстовом поле можно создать, используя поведение, связанное с текстовым полем.

    Базовые службы

    Библиотеки клиентских сценариев AJAX в ASP.NET состоят из файлов JavaScript (с расширением JS), содержащих функциональные элементы, используемые для объектно-ориентированной разработки. Объектно-ориентированные возможности, включенные в библиотеки клиентских сценариев AJAX в ASP.NET, обеспечивают высокий уровень совместимости и модульности при написании клиентских сценариев. В состав клиентской архитектуры входят следующие базовые службы:

  • Объектно-ориентированные расширения JavaScript, такие как классы, пространства имен, обработка ошибок, наследование, типы данных и сериализация объектов.
  • Библиотека базовых классов, включающая такие компоненты, как построители строк и расширенная обработка ошибок.
  • Поддержка библиотек JavaScript, внедренных в сборку или предоставляемых в виде отдельных файлов JavaScript (с расширением JS). Внедрение библиотек JavaScript в сборку облегчает развертывание приложений и помогает в решении проблем, связанных с поддержкой разных версий кода.
  • Cерверная архитектура AJAX

    Серверные составляющие, поддерживающие разработку с использованием технологии AJAX, состоят из веб-сервера ASP.NET, а также серверных элементов управления и компонентов, управляющих пользовательским интерфейсом и потоком выполнения приложения. Эти серверные составляющие управляют также сериализацией, проверкой, расширяемостью элементов управления и т. п. Существуют также веб-службы ASP.NET, позволяющие осуществлять доступ к службам приложения ASP.NET, используемых для проверки подлинности на основе форм, поддержки ролей и пользовательских профилей.

    Поддержка сценариев

    Возможности AJAX в ASP.NET реализуется с использованием служебных сценариев, отправляемых сервером клиенту. В зависимости от того, какие возможности AJAX требуются приложению, обозревателю отправляются разные сценарии.

    Можно также создавать пользовательские клиентские сценарии для приложений ASP.NET. В таком случае можно использовать возможности AJAX для управления пользовательскими сценариями как статическими JS-файлами (на диске) или JS-файлами, внедренными в сборку в качестве ресурсов.

    Возможности ASP.NET AJAX включают в себя модель для режимов выпуска и откладки. Режим выпуска предоставляет проверку ошибок и обработку исключений, оптимизированную для повышения производительности при минимальном размере сценария. Режим отладки предоставляет более основательные возможности отладки, такие как проверка типов и аргументов. ASP.NET выполняет отладочные версии, когда приложение выполняется в режиме откладки. Это позволяет выбрасывать исключения в сценариях отлаживаемого приложения и свести к минимуму размер кода выпуска.

    Благодаря поддержке сценариев AJAX в ASP.NET реализуются две важные функции:

  • Microsoft AJAX (библиотека), которая является системой типов и набором расширений JavaScript, предоставляющих пространства имен, наследование, интерфейсы, перечисления, отражение и дополнительные функции.
  • Частичная отрисовка страниц, при котором обновляются части страницы с использованием асинхронной обратной передачи.
  • Веб-службы

    Функциональность AJAX позволяет вызывать из клиентского сценария веб-страницы ASP.NET веб-службы ASP.NET (файлы с расширением ASMX) и службы Windows Communication Foundation (WCF) (файлы с расширением SVC). Ссылки на необходимые сценарии автоматически добавляются в состав страницы, а эти сценарии, в свою очередь, автоматически создают прокси-классы веб-служб, используемые из клиентских сценариев для вызова этих служб.

    Можно также осуществлять доступ к веб-службам ASP.NET с использованием серверных элементов управления ASP.NET AJAX (например, при использовании другой среды веб-разработки). Для этого можно вручную включать в состав страницы ссылки на Microsoft AJAX (библиотека), файлы сценариев и веб-службы. Во время выполнения ASP.NET создает прокси-классы, которые можно использовать для вызова этих служб.

    Серверные элементы управления

    Серверные элементы управления AJAX ASP.NET состоят из кода сервера и клиента, интеграция которых позволяет реализовать полнофункциональное клиентское поведение. При добавлении элемента управления AJAX в состав веб-страницы ASP.NET страница автоматически отправляет обозревателю клиентские сценарии для поддержки функциональных возможностей AJAX. Можно также написать дополнительный клиентский код для настройки функциональных возможностей элемента управления, но это не обязательно.

    Ниже приведен список наиболее часто используемых серверных элементов управления ASP.NET AJAX:

  • ScriptManager

    Управляет ресурсами сценариев для клиентских компонентов, частичной отрисовки страниц, локализации, глобализации и пользовательских сценариев. Элемент управления ScriptManager необходим для использования элементов управления UpdatePanel, UpdateProgress и Timer.

  • UpdatePanel

    Позволяет обновлять отдельные части страницы вместо обновления ее целиком, осуществляемого путем использования синхронной обратной передачи.

  • UpdateProgress

    Предоставляет информацию о состоянии касательно частичного обновления страницы в элементах управления UpdatePanel.

  • Timer

    Выполняет операции обратной передачи с заданной периодичностью. Элемент управления Timer можно использовать для периодического обновления всей страницы или же ее части; в последнем случае он используется совместно с элементом управления UpdatePanel.

  • Дополнительные источники:

  • http://netcode.ru/dotnet/?artID=6384
  • http://www.aspnetmania.com/Articles/Article/77.html
  • http://www.asp.net/default.aspx?tabindex=9tabid=47
  • http://www.microsoft.com/rus/msdn/magazine/2006/07/GiblbsASP.Net Ajax.mspx
  • http://www.realcoding.net/articles/aspnet-ASP.Net Ajax-%E2%80%93-vnedrenie-tekhnologii-ajax-asynchronous-javascript-xml.html
  • http://msdn.microsoft.com/ru-ru/library/bb398874.aspx
  • Страницы:

    Термин Ajax был введен в 2005 году в статье Jesse James Garrett. Первоначально он использовался для обозначения семейства взаимосвязанных технологий, реализующих различные формы удаленного исполнения сценариев. В наши дни все разновидности удаленных сценарных технологий обычно помечаются префиксом AJAX. Современные решения на базе AJAX для платформы Windows основаны на объекте XmlHttpRequest.

    В AJAX-приложениях сочетаются два фактора. С одной стороны, приложение должно передавать пользователям свежие данные, полученные с сервера. С другой стороны, новые данные должны интегрироваться в существующую страницу без ее полного обновления.

    Браузер обычно выдает новый запрос при отправке формы HTML, инициированной либо сценарием, работающим на стороне клиента, либо действием пользователя (скажем, щелчком на кнопке). Получив ответ, браузер заменяет старую страницу новой.

    Основным фактором, заложенным в основу удаленного исполнения сценариев, является возможность выдачи внеполосных запросов HTTP. В данном контексте под внеполосным вызовом понимается запрос HTTP, который выдается за пределами встроенного модуля, обеспечивающего отправку форм HTTP Внеполосный вызов инициируется событием страницы HTML и обслуживается компонентом-посредником (proxy component). В новейших AJAX-решениях таким посредником является объект XmlHttpRequest ; в самых первых реализациях RS им был апплет Java

    Данная технология построена на принципе выполнения запроса к серверу с использованием JavaScript и получению результата опять же, с помощью JavaScript, что позволяет избежать перегрузки страницы и следовательно имеет несколько неоспоримых преимуществ:

  • На сервер отправляются не все элементы страницы (точнее не их значения), а только те минимальные данные, которые необходимы для выполнения того или иного запроса и в ответ принимается не вся страница, а только необходимые данные, что позволяет уменьшить трафик в десятки (а иногда и в сотни) раз.
  • Не происходит перегрузка страницы в браузере и у пользователя создается впечатление, что все происходит на его компьютере.
  • Объектная модель браузера.

    Document Object Model (DOM) – это спецификация, стандартизированная W3C комитетом, которая является кроссплатформенной и описывает действия с самим документом, его структурой, HTML, XML и стилями. Как следует из названия, основой спецификации DOM являются объекты.

    Спецификация DOM (Document Object Model) определяет общий интерфейс обновления содержимого, структуры и стиля документов HTML и XML, не зависящий от языка и платформы. Стандарт DOM получил признание и был ратифицирован комитетом W3C, поэтому сейчас он поддерживается все большим количеством браузеров. DOM определяет стандартный набор объектов для представления элементов, образующих документы HTML и XML. Совокупность этих объектов образует стандартный интерфейс для работы с элементами страниц HTML, или на более общем уровне — документов XML.

    Следует заметить, что хотя первые работоспособные прикладные среды удаленного исполнения сценариев появились около десяти лет назад, ограниченная поддержка динамического изменения отображаемого документа в браузере тормозила массовое принятие таких технологий в масштабах отрасли. До сегодняшнего дня.

    Объект XMLHttpRequest

    Объект XmlHttpRequest впервые появился в Internet Explorer 5.0. Этот внутренний объект публикуется браузером для работы с его подсистемой исполнения сценариев. Сценарный код, входящий в клиентскую страницу (как правило, код JavaScript), обращается к объекту и использует его функциональность.

    Что касается функциональности (несмотря на префикс XML),объект XmlHttpRequest представляет собой компактную объектную модель для отправки сценарием обращений HTTP в обход браузера. Когда пользователь щелкает на кнопке отправки формы или выполняет любое действие, приводящее к вызову метода submit объекта form модели DOM, браузер вмешивается в происходящее и берет последующую отправку запроса HTTP под свой полный контроль. С точки зрения пользователя, отправка запроса работает по принципу "черного ящика" с единственным видимым результатом: на экране появляется новая страница. Клиентский код сценария не может управлять процессом размещения и результатом отправки запроса.

    Объект XmlHttpRequest дает возможность сценарному коду отправлять запросы HTTP и обрабатывать полученные ответы.

    Важно заметить, что этот объект не является стандартом W3C, хотя многое из его функциональности описано в спецификации "The DOM Level 3 Load and Save Specification". По этой причине его поведение может немного отличаться в различных браузерах. Но во всех браузерах он выполняет одну и ту же функциональность – он умеет посылать запросы к серверу и получать от него ответы. Как уже говорилось выше, данный объект не стандартизирован и создание его instance может отличаться в различных версиях, поэтому для "надежного" его создания лучше использовать код, который объединяет в себе создание instance в нескольких браузерах подобно коду ниже:

    var xmlHttp; 
      function createXMLHttpRequest()  
      { 
       if (window.ActiveXObject)  
       { 
        xmlHttp = new ActiveXObject("Microsoft.XMLHTTP"); 
       } 
       else if (window.XMLHttpRequest)  
       { 
        xmlHttp = new XMLHttpRequest(); 
       } 
      }

    XMLHttpRequest имеет ряд "стандартных" (стандартных в кавычках т.к. как писалось выше, данный объект не стандартизирован для всех браузеров) свойств и методов, которые позволяют данному объекту посылать запрос, проверять состояние запроса и получать результат выполнения запроса от удаленного сервера. Эти свойства и методы мы рассмотрим в следующих двух таблицах.

    В таблице 1 представлены "стандартные" свойства XMLHttpRequest

    Метод Описание
    abort() Прерывает текущий запрос
    getAllResponseHeaders() Возвращает все заголовки Response в виде ключ/значение
    getResponseHeader(header) Возвращает значение определенного заголовка
    open(method, url, asynch, username, password) Устанавливает состояние запроса к серверу. Первый параметр указывает метод запроса – PUT, GET, POST, второй – url запроса, третий (необязательный) – тип запроса (синхронный или асинхронный), четвертый и пятый (также необязательные) – для защищенных страниц
    send(content) Посылает запрос серверу
    setRequestHeader(header, value) Устанавливает значение определенного заголовка. Перед вызовом этого метода необходимо вызвать метод open

    Также XMLHttpRequest содержит ряд свойств, которые представлены ниже:

    Свойство Описание
    onreadystatechange Обработчик события, которое возникает при каждой смене состояния запроса
    readyState Состояние запроса. Доступны следующие значения: 0 – запрос неинициализирован, 1 – загрузка, 2 – загрузка окончена, 3 – interactive, 4 - complete
    responseText Ответ от сервера в виде строки
    responseXML Ответ от сервера в XML. Этот объект может быть обработан и проверен как DOM
    status Код статуса HTML.(например 200 – OK)
    statusText Название кода статуса HTML

    Бегло проглянув эти методы, несложно понять, какие методы достаточно вызвать, чтобы с помощью JavaScript получить какие-либо данные с сервера.

    Внеполосные вызовы из страниц ASP.NET

    Для веб-страницы, выдающей внеполосные вызовы, определяется одно или несколько триггерных событий, которые в результате обработки кодом JavaScript выдают запросы через объект .Триггерными событиями могут быть только события HTML, отслеживаемые реализацией DOM текущего браузера.

    Код JavaScript должен инициировать обращение к удаленному URL и управлять им, как показано в следующем фрагменте:

    <script type="text/javascript">
      function SendRequest(url, params) " {
       // Включение параметров в строку запроса
       var pageUrl - url + "?outofband-trueparam" + params;
       /' Инициализация объекта XmlHttpRequest
       var xmlRequest, e;
       try {
        xml Request = new XMLHttpRequest();
        catch(e) { try {
        xmlRequest = new ActiveXObject('Microsoft.XMLHTTP");
       }
       catch(e) { }
      }
      // Подготовка к отправке синхронного запроса 
      POST xmlRequest,ореп("POST". pageUrl. false); 
      xmlRequest.setRequestHeader("Content-Type", "application/x-www-form-urlencoded"); 
      xmlRequest.send(nul1);
      return xmlRequest;
     }
    </script>

    Функция в приведенном примере получает две строки — вызываемый URL и список параметров. Формат строки запроса никак не стандартизирован и может произвольно изменяться в каждой конкретной реализации.

    В нашем примере URL, заданный программистом, дополняется парой параметров. Первый параметр ( outof band в нашем примере) представляет собой логический флаг, который указывает, должен ли запрос обрабатываться пользовательской функцией обратного вызова. Располагая этой информацией, целевая страница сможет обеспечить правильную обработку запроса. Во втором параметре ( param в нашем примере) передаются входные параметры для кода, исполняемого на стороне сервера.

    Код страницы выглядит примерно так:

    <html xmlns="http://www.w3.org/1999/xhtml" > 
      <head runat="server">
        <title>Testing Out-of-band</title> 
      </head>
      <body>
        <form id="Forml" runat="server"> 
          <hl>Demonstrate Out-of-band Calls</hl> 
          <h2>%=Request.Url%></h2> 
          <hr />
     
          <asp:DropDownList runat="server" ID="EmployeeList" /> 
          <input id="Button1"  type="button" 
                 value="Go Get Data" onclick="MoreInfo()" /> 
          <hr />
          <span id="Msg" /> 
        </form> 
      </body> 
    </html>

    Класс программной логики ( code-behind class ) приведен в следующем листинге:

    public partial class _Default : System.Web.UI.Page
    { 
      protected void Page_Load(object sender, EventArgs e) 
      {
        if (IsOutOfBan())
        return; 
        if (!IsPostBack)
        PopulateList();
      }
    
      private bool IsOutOfBand()
      {
        if (Request.QueryString["outofband"] != null) 
        {
          String param = Request.QueryString["param"].ToString(); 
          Response.Write(ExecutePageMethod(param)); 
          Response.Flush(); 
          Response. End(); 
          return true:
        }
        return false;
      }
    
      private void PopulateList() 
      { 
        SqlDataAdapter adapter = new SqlDataAdapter(
            "SELECT employeeid, lastname FROM employees",
            "SERVER=(1ocal); DATABASE=northwind; UID=...;"); 
        DataTable table = new DataTable(); 
        adapter.Fill(table);
        EmployeeList.DataTextField = "lastname"; 
        EmployeeList.DataValueField = "employeeid"; 
        EmployeeList.DataSource = table; 
        EmployeeList.DataBind();
      }
      
      string ExecutePageMethod(string eventArgument) {
        return "You clicked: " + eventArgument;
      }
    }

    Код на стороне клиента

    Внеполосный вызов ASP.NET начинается с выполнения функции JavaScript, предоставленной системой. Как правило, эта функция связывается с обработчиком события уровня страницы — такого, как щелчок на кнопке или изменение выбранной строки в раскрывающемся списке. Для наглядности рассмотрим конкретный пример.

    Представьте веб-страницу, на которой отображается информация о работнике. Пользователь выбирает имя из списка и щелкает на кнопке, чтобы получить дополнительную информацию. Чтобы механизм внеполосного вызова успешно работал, кнопка не должна быть кнопкой отправки ( submit button ); в противном случае произойдет обычная отправка данных с полным обновлением страницы. Возьмем следующую разметку:

    <asp:DropDownList ID="cboEmployees" runat="server"
          DataTextField="lastname" DataValueFiel="employeeid" />
    <input type="button" runat="server" 
           id="buttonTrigger" value="More Info">

    Пользователь выбирает элемент из списка и щелкает на кнопке, чтобы получить дополнительную информацию. Обработчик события onclick кнопки добавляется динамически при обработке страницы на сервере. Такие вещи уместно делать при обработке события Page_Load:

    protected void Page_Load (object sender, EventArgs e) 
    {
      if (!IsPostBack) 
      {
        // Заполнение списка
        cboEmployees.DataSource = GetEmployeeList();
        cboEmployees.DataBind();
        // Построить средствами ASP.NET строку с функцией Javascript,
        // вызываемой для инициирования внеполосного вызова 
        string rpc = ClientScript.GetCallbackEventReference(
            this,
            "document.forms[0].elements['cboEmployees'].value",
            "UpdatePage",
            "null",
            "null",
            false);
        // Инициирование внеполосного вызова кнопкой 
        string js - String.Format("javascript:{0}". rpc): 
        buttonTrigger.Attributes["onclick"] = js:
      }
    }
    
    private Collection<Employee> GetEmployeeList()
    {
        ...
    }

    ASP.NET Script Callback предоставляет собственный JavaScript API для инкапсуляции всех необходимых обращений к XmlHttpRequest. Вместо этого следует направить все внимание на программный интерфейс метода GetCallbackEventReference объекта Page.ClientScript. Метод получает параметры, используемые при вызове, и возвращает строку с исходным кодом JavaScript, предназначенную для внедрения в страницу. Когда страница передается пользователю, кнопка, инициирующая внеполосный вызов, связывается со следующим сценарием:

    <input name="buttonTrigger" type="button" 
           id="button1" value="More Info"
           onclick="javascript:WebForm_DoCallback('__Page",
                       document.forms[0].elements['cboEmployees'].value, 
                       UpdatePage,null, null, false)" />

    сценарий хранится в ресурсах сборки и связывается со страницей при помощи динамически сгенерированной директивы включения сценария:

    <script src="/ProAspNetAdv/WebResource.axd?d=...t=..." type="text/javascript"></script>

    В странице, предоставленной пользователю, этот элемент располагается непосредственно за открывающим тегом .Не стоит и говорить, что вызывает объект и управляет запросом HTTP.

    Общие сведения о ASP.NET AJAX

    Возможности AJAX в ASP.NET позволяют быстро создавать веб-страницы с обогащенным пользовательским интерфейсом, содержащим известные элементы пользовательского интерфейса. К числу возможностей AJAX относятся библиотеки клиентских сценариев, включающие не зависящие от обозревателя технологии ECMAScript (JavaScript) динамического HTML (DHTML), также интеграцию с серверной платформой разработки ASP.NET. Используя возможности AJAX, можно улучшить пользовательский интерфейс веб-приложений и повысить их эффективность.

    Приложения с поддержкой AJAX обладают следующими достоинствами:

  • повышенная эффективность благодаря тому, что значительная часть обработки веб-страницы выполняется в обозревателе;
  • знакомые элементы пользовательского интерфейса, такие как индикаторы хода выполнения, подсказки и всплывающие окна;
  • частичное обновление страницы, при котором обновляются лишь отдельные части изменившейся веб-страницы;
  • интеграция клиента со службами приложения ASP.NET для проверки подлинности с помощью форм, управления ролями и пользовательскими профилями;
  • автоматически создаваемые прокси-классы, упрощающие вызов методов веб-службы из клиентского сценария;
  • структура, позволяющая настраивать серверные элементы управления для включения клиентских возможностей;
  • поддержка наиболее популярных и распространенных обозревателей, включая Microsoft Internet Explorer, Mozilla Firefox и Apple Safari.
  • Архитектура возможностей AJAX в ASP.NET

    Архитектура возможностей AJAX в ASP.NET состоит из двух частей: библиотек клиентских сценариев и серверных компонентов. Благодаря интеграции этих двух частей образуется надежная структура разработки.

    (рис 9.1) Клиентская и серверная архитектуры ASP.NET AJAX

    Иллюстрация демонстрирует функциональность клиентской Microsoft AJAX (библиотека), включающей поддержку создания клиентских компонентов, совместимость с обозревателями, сетевые и базовые службы. Также в примере показана функциональность серверных элементов AJAX, включая поддержку сценариев, веб-службы, службы приложения и серверные элементы управления. В следующих разделах эти возможности описаны более подробно.

    Клиентская архитектура технологии AJAX

    Клиентская архитектура включает библиотеки для поддержки компонентов, совместимость с обозревателями, сетевые средства и базовые службы

    Компоненты

    С помощью клиентских компонентов реализуется обогащенный пользовательский интерфейс в обозревателе без операций обратной передачи. Компоненты делятся на три категории:

  • невизуальные объекты, инкапсулирующие код, как объект, представляющий таймер;
  • поведения, расширяющие базовое поведение существующих элементов DOM;
  • Элементы управления, представляющие новый элемент DOM, обладающий пользовательским поведением.
  • Тип используемого компонента зависит от требуемого типа клиентского поведения. Например, водяной знак в существующем текстовом поле можно создать, используя поведение, связанное с текстовым полем.

    Базовые службы

    Библиотеки клиентских сценариев AJAX в ASP.NET состоят из файлов JavaScript (с расширением JS), содержащих функциональные элементы, используемые для объектно-ориентированной разработки. Объектно-ориентированные возможности, включенные в библиотеки клиентских сценариев AJAX в ASP.NET, обеспечивают высокий уровень совместимости и модульности при написании клиентских сценариев. В состав клиентской архитектуры входят следующие базовые службы:

  • Объектно-ориентированные расширения JavaScript, такие как классы, пространства имен, обработка ошибок, наследование, типы данных и сериализация объектов.
  • Библиотека базовых классов, включающая такие компоненты, как построители строк и расширенная обработка ошибок.
  • Поддержка библиотек JavaScript, внедренных в сборку или предоставляемых в виде отдельных файлов JavaScript (с расширением JS). Внедрение библиотек JavaScript в сборку облегчает развертывание приложений и помогает в решении проблем, связанных с поддержкой разных версий кода.
  • Cерверная архитектура AJAX

    Серверные составляющие, поддерживающие разработку с использованием технологии AJAX, состоят из веб-сервера ASP.NET, а также серверных элементов управления и компонентов, управляющих пользовательским интерфейсом и потоком выполнения приложения. Эти серверные составляющие управляют также сериализацией, проверкой, расширяемостью элементов управления и т. п. Существуют также веб-службы ASP.NET, позволяющие осуществлять доступ к службам приложения ASP.NET, используемых для проверки подлинности на основе форм, поддержки ролей и пользовательских профилей.

    Поддержка сценариев

    Возможности AJAX в ASP.NET реализуется с использованием служебных сценариев, отправляемых сервером клиенту. В зависимости от того, какие возможности AJAX требуются приложению, обозревателю отправляются разные сценарии.

    Можно также создавать пользовательские клиентские сценарии для приложений ASP.NET. В таком случае можно использовать возможности AJAX для управления пользовательскими сценариями как статическими JS-файлами (на диске) или JS-файлами, внедренными в сборку в качестве ресурсов.

    Возможности ASP.NET AJAX включают в себя модель для режимов выпуска и откладки. Режим выпуска предоставляет проверку ошибок и обработку исключений, оптимизированную для повышения производительности при минимальном размере сценария. Режим отладки предоставляет более основательные возможности отладки, такие как проверка типов и аргументов. ASP.NET выполняет отладочные версии, когда приложение выполняется в режиме откладки. Это позволяет выбрасывать исключения в сценариях отлаживаемого приложения и свести к минимуму размер кода выпуска.

    Благодаря поддержке сценариев AJAX в ASP.NET реализуются две важные функции:

  • Microsoft AJAX (библиотека), которая является системой типов и набором расширений JavaScript, предоставляющих пространства имен, наследование, интерфейсы, перечисления, отражение и дополнительные функции.
  • Частичная отрисовка страниц, при котором обновляются части страницы с использованием асинхронной обратной передачи.
  • Веб-службы

    Функциональность AJAX позволяет вызывать из клиентского сценария веб-страницы ASP.NET веб-службы ASP.NET (файлы с расширением ASMX) и службы Windows Communication Foundation (WCF) (файлы с расширением SVC). Ссылки на необходимые сценарии автоматически добавляются в состав страницы, а эти сценарии, в свою очередь, автоматически создают прокси-классы веб-служб, используемые из клиентских сценариев для вызова этих служб.

    Можно также осуществлять доступ к веб-службам ASP.NET с использованием серверных элементов управления ASP.NET AJAX (например, при использовании другой среды веб-разработки). Для этого можно вручную включать в состав страницы ссылки на Microsoft AJAX (библиотека), файлы сценариев и веб-службы. Во время выполнения ASP.NET создает прокси-классы, которые можно использовать для вызова этих служб.

    Серверные элементы управления

    Серверные элементы управления AJAX ASP.NET состоят из кода сервера и клиента, интеграция которых позволяет реализовать полнофункциональное клиентское поведение. При добавлении элемента управления AJAX в состав веб-страницы ASP.NET страница автоматически отправляет обозревателю клиентские сценарии для поддержки функциональных возможностей AJAX. Можно также написать дополнительный клиентский код для настройки функциональных возможностей элемента управления, но это не обязательно.

    Ниже приведен список наиболее часто используемых серверных элементов управления ASP.NET AJAX:

  • ScriptManager

    Управляет ресурсами сценариев для клиентских компонентов, частичной отрисовки страниц, локализации, глобализации и пользовательских сценариев. Элемент управления ScriptManager необходим для использования элементов управления UpdatePanel, UpdateProgress и Timer.

  • UpdatePanel

    Позволяет обновлять отдельные части страницы вместо обновления ее целиком, осуществляемого путем использования синхронной обратной передачи.

  • UpdateProgress

    Предоставляет информацию о состоянии касательно частичного обновления страницы в элементах управления UpdatePanel.

  • Timer

    Выполняет операции обратной передачи с заданной периодичностью. Элемент управления Timer можно использовать для периодического обновления всей страницы или же ее части; в последнем случае он используется совместно с элементом управления UpdatePanel.

  • Дополнительные источники:

  • http://netcode.ru/dotnet/?artID=6384
  • http://www.aspnetmania.com/Articles/Article/77.html
  • http://www.asp.net/default.aspx?tabindex=9tabid=47
  • http://www.microsoft.com/rus/msdn/magazine/2006/07/GiblbsASP.Net Ajax.mspx
  • http://www.realcoding.net/articles/aspnet-ASP.Net Ajax-%E2%80%93-vnedrenie-tekhnologii-ajax-asynchronous-javascript-xml.html
  • http://msdn.microsoft.com/ru-ru/library/bb398874.aspx
  • Вернуться к учебному плану