Технология Script Callbacks

Протокол HTTP предназначался для выполнения запросов без сохранения состояния предыдущей страницы. По мере "утяжеления" страниц и особенно для станиц, отображающих информацию из баз данных, возникает крайняя необходимость в возможности обновления данных без обновления остального содержания страницы. Решением этой проблемы может быть предоставление Web-броузером возможности выполнения параллельного вызова. В ASP.NET 2.0 для этих целей был предоставлен механизм, называемый обратным вызовом сценария (Script Callbacks). При реализации обратного вызова сценария с asp-страницей связывается файл сценария на языке JavaScript. Этот файл сценария содержит функцию, которая и осуществляет параллельный вызов.

В Internet Explorer существует объект, позволяющий выполнять передачу строк в формате XML по протоколу HTTP. Это СОМ-объект, имеющий дружественное имя Microsoft.XmlHttp (ProgID системного реестра). Internet Explorer осуществляет параллельный вызов посредством объекта XmlHttpRequest, который отправляет запрос серверу, получает ответ и передает его клиентской функции обратного вызова.

Для реализации механизма обратного вызова сценария библиотека Framework предоставляет интерфейс ICallbackEventHandler, определяющий две функции: GetCallbackResult и RaiseCallbackEvent. Функция RaiseCallbackEvent должна содержать код, выполняемый на серверной стороне в ответ на обратный вызов, а функция GetCallbackResult возвращает результат.

Метод ClientScriptManager.GetCallbackEventReference получает ссылку на функцию на стороне клиента, которая инициирует выполнение обратного вызова на серверной стороне.

Следующий пример иллюстрирует применение метода GetCallbackEventReference в обратном вызове сценария:

<%@ Page Language="C#" %>

<%@ Implements Interface =

          "System.Web.UI.ICallbackEventHandler" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<script runat="server">

   public int cbCount = 0;

    // Определяем метод, который обрабатывает

    // обратный вызов на сервере:

   public void RaiseCallbackEvent(String eventArgument)

    {

     cbCount = Convert.ToInt32(eventArgument) + 1;

    }

    // Определяем метод, который возвращает

    // результат обратного вызова:

    public string GetCallbackResult()

    {  return cbCount.ToString(); }

   protected void Page_Load(object sender,   EventArgs e)

   {

   // Определяем объект StringBuilder,

   // который будет содержать сообщения для вывода

     StringBuilder sb = new StringBuilder();

 

   // Проверяем свойство IsPostBack, определяющее загружена

   // страница как "postback",  или она загружена первый раз

    sb.Append("postback не выполнялся");

    if (Page.IsPostBack)

      {sb.Append("был postback"); }

        // Записываем любое сообщение

        MyLabel.Text = sb.ToString();

 

     // Получаем ссылку на скрипт

     //  ClientScriptManager из класса Page

   ClientScriptManager cs = Page.ClientScript;

    // Обратный вызов сценария будет определен

    // в блоке сценария на странице

   StringBuilder context1 = new StringBuilder();

   context1.Append(

     "function ReceiveServerData1(arg, context)");

   context1.Append("{");

   context1.Append("Mes1.innerText =  arg;");

   context1.Append("value1 = arg;");

   context1.Append("}");

 

   // Определение ссылки обратного вызова

String cbReference1 =

   cs.GetCallbackEventReference(this,

                "arg",

                "ReceiveServerData1",

                context1.ToString());

String cbReference2 =

   cs.GetCallbackEventReference("’" +

                Page.UniqueID + "’",

                "arg",

                "ReceiveServerData2",

                "",

                "ProcessCallBackError",

                false);

String callbackScript1 =

       "function CallTheServer1(arg, context) {" +

        cbReference1 + "; }";

String callbackScript2 =

       "function CallTheServer2(arg, context) {" +

       cbReference2 + "; }";

 

   // Регистрация клиентского скрипта,

   // выполняющего вызов сервера

cs.RegisterClientScriptBlock(this.GetType(),

                             "CallTheServer1",

                               callbackScript1,

                               true);

        cs.RegisterClientScriptBlock(this.GetType(),

                          "CallTheServer2",

                           callbackScript2,

                           true);

 

    }

</script>

 

<script type="text/javascript">

var value1 = 0;

var value2 = 0;

function ReceiveServerData2(arg, context)

{

    Mes2.innerText = arg;

    value2 = arg;

}

function ProcessCallBackError(arg, context)

{   Mes2.innerText = ‘Ош.’; }

</script>

 

<html xmlns="http://www.w3.org/1999/xhtml" >

<head id="Head1" runat="server">

    <title>ClientScriptManager </title>

</head>

<body>

    <form id="Form1" runat="server">

    <div>

   Callback 1 result: <span id="Mes1">0</span>

   <br />

   Callback 2 result: <span id="Mes2">0</span>

    <br /> <br />

   <input type="button"

          value="ClientCallBack1"

          onclick="CallTheServer1(value1,

                 alert(‘Увел значение’))"/>

   <input type="button"

          value="ClientCallBack2"

          onclick="CallTheServer2(value2,

                alert(‘Увел. значение’))"/>

   <br /> <br />

   <asp:Label id="MyLabel"

          runat="server"></asp:Label>

   </div>

   </form>

</body>

</html>

Механизм параллельного вызова используется и непосредственно самими элементами управления ASP.NET, такими как GridView и TreeView.

Вы можете следить за любыми ответами на эту запись через RSS 2.0 ленту. Вы можете оставить ответ, или trackback с вашего собственного сайта.

Оставьте отзыв

XHTML: Вы можете использовать следующие теги: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

 
Rambler's Top100