Технология 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 с вашего собственного сайта.