Программная реализация обратных вызовов клиента без обратной передачи в веб-страницы ASP.NET

Обновлен: Ноябрь 2007

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

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

Обратные вызовы клиента могут использовать несколько элементов управления веб-сервера. Например, элемент управления TreeView использует обратные вызовы клиента для реализации его функциональной возможности заполнения по требованию. Дополнительные сведения см. в разделе Общие сведения о серверном веб-элементе управления TreeView.

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

Общие сведения о возможностях AJAX в ASP.NET для автоматизации обратного вызова клиента см. в следующих разделах:

Можно также написать собственный клиентский сценарий для прямой реализации обратных вызовов клиента. В этом разделе обсуждается реализация собственных обратных вызовов клиента для асинхронной связи между клиентом и сервером.

Компоненты обратных вызовов клиента

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

  • Реализовать интерфейс ICallbackEventHandler. Можно добавить это интерфейс объявление к любой веб-странице ASP.NET.

  • Обеспечить реализацию метода RaiseCallbackEvent. Этот метод будет вызван для выполнения обратного вызова на сервере.

  • Обеспечить реализацию метода GetCallbackResult. Этот метод будет возвращать результат обратного вызова в клиент.

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

  • Одна функция вызывает вспомогательный метод, который выполняет фактический запрос на сервер. В этой функции можно выполнить пользовательскую логику для подготовки сначала аргументов события. Можно отправить строку как параметр в обработчик событий обратного вызова на стороне сервера.

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

  • Третья функция является вспомогательной, которая выполняет фактический запрос на сервер. Эта функция генерируется автоматически системой ASP.NET при создании ссылки на эту функцию с помощью метода GetCallbackEventReference в серверном коде.

И обратные вызовы клиента, и обратные отправки являются запросами начальной страницы. Поэтому обратные вызовы клиента и обратные отправки записываются в журналах веб-сервера как запрос страницы.

Реализация обязательных интерфейсов в серверном коде

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

Объявление интерфейса ICallbackEventHandler

Интерфейс ICallbackEventHandler можно объявить как часть объявления класса страницы. Если создается страница с фоновым кодом, можно объявить интерфейс с помощью следующего синтаксиса.

Partial Class CallBack_DB_aspx
    Inherits System.Web.UI.Page
    Implements System.Web.UI.ICallbackEventHandler
public partial class CallBack_DB_aspx : 
    System.Web.UI.Page, System.Web.UI.ICallbackEventHandler

При работе с однофайловой страницей или элементом управления можно добавить объявление на страницу с помощью директивы @ Implements, как в следующих примерах:

<%@ Page Language="VB" %>
<%@ Implements Interface="System.Web.UI.ICallbackEventHandler" %>
<%@ Page Language="C#" %>
<%@ Implements Interface="System.Web.UI.ICallbackEventHandler" %>
ms178208.alert_note(ru-ru,VS.90).gifПримечание.

Имя интерфейса задается с учетом регистра.

Создание метода обратного вызова сервера

В серверном коде необходимо создать метод, реализующий метод RaiseCallbackEvent, и метод, реализующий метод GetCallbackResult. Метод RaiseCallbackEvent принимает однострочный аргумент вместо двух аргументов, которые обычно используются с обработчиками событий. Часть метода должна выглядеть, как в следующем примере:

Public Sub RaiseCallbackEvent(ByVal eventArgument As String) _
    Implements System.Web.UI.ICallbackEventHandler.RaiseCallbackEvent

End Sub
public void RaiseCallbackEvent(String eventArgument)
{

}

Метод GetCallbackResult не принимает аргументы и возвращает строку. Часть метода должна выглядеть, как в следующем примере:

Public Function GetCallbackResult() As String Implements _
    System.Web.UI.ICallbackEventHandler.GetCallbackResult
    Return aStringValue
End Function
public string GetCallbackResult()
{
    return aStringValue;
}

Создание функций клиентского сценария

Необходимо добавить функции клиентского сценария к странице, чтобы выполнить две возможности: отправить обратный вызов на страницу сервера и получить результаты. Обе функции клиентского сценария пишутся на языке ECMAScript (JavaScript).

Отправка обратного вызова

Функция для обратного вызова генерируется в серверном коде. Фактический обратный вызов выполняется функцией библиотеки, которая доступна любой странице, реализующей интерфейс ICallbackEventHandler. Можно получить ссылку на функцию библиотеки с помощью вызова метода GetCallbackEventReference страницы, который доступен через свойство ClientScript страницы. Затем выполняется динамическое построение клиентской функции, которая включает вызов возвращаемого значения из метода GetCallbackEventReference. Передайте этому методу ссылку на страницу (this в C# или Me в Visual Basic), имя аргумента, который будет использоваться для передачи данных, имя функции клиентского сценария, который получит данные обратного вызова, и аргумент, который передает любой нужный контекст.

После построения функции вставьте ее на страницу вызовом метода RegisterClientScriptBlock.

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

Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) _
    Handles Me.Load
    Dim cm As ClientScriptManager = Page.ClientScript
    Dim cbReference As String
    cbReference = cm.GetCallbackEventReference(Me, "arg", _
        "ReceiveServerData", "")
    Dim callbackScript As String = ""
    callbackScript &= "function CallServer(arg, context)" & _
        "{" & cbReference & "; }"
    cm.RegisterClientScriptBlock(Me.GetType(), _
        "CallServer", callbackScript, True)End Sub
void Page_Load(object sender, EventArgs e)
{
    ClientScriptManager cm = Page.ClientScript;
    String cbReference = cm.GetCallbackEventReference(this, "arg",
        "ReceiveServerData", "");
    String callbackScript = "function CallServer(arg, context) {" +
        cbReference + "; }";
    cm.RegisterClientScriptBlock(this.GetType(),
        "CallServer", callbackScript, true);
}

Имена аргументов, принимаемых создаваемой функцией, должны соответствовать именам значений, передаваемых методу GetCallbackEventReference.

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

<input type="button" value="Callback" 
    onclick="CallServer(1, alert('Callback'))"/>
<br />
<span id="Message"></span>
<input type="button" value="Callback" 
    onclick="CallServer(1, alert('Callback'))"/>
<br />
<span id="Message"></span>

Получение обратного вызова

Можно написать клиентскую функцию, которая статически получает обратные вызовы на странице. Имя функции должно соответствовать имени, передаваемому в вызове метода GetCallbackEventReference. Получающая функция принимает два строковых значения: одно для возвращаемого значения и дополнительное — для значения контекста, передаваемого обратно с сервера.

Эта функция может выглядеть, как в следующем примере:

<script type="text/javascript">
function ReceiveServerData(arg, context)
{
    Message.innerText = 'Processed callback.';
}
</script>

См. также

Основные понятия

Пример реализации обратного вызова от клиента (Visual Basic)

Пример реализации обратного вызова клиента (C#)

Ссылки

ClientScriptManager