Модель страницы ASP.NET 2.0

от Корпорации Майкрософт

В ASP.NET 1.x разработчики имели выбор между встроенной моделью кода и моделью кода программной части. Код программной части можно реализовать с помощью атрибута Src или атрибута CodeBehind директивы @Page . В ASP.NET 2.0 разработчики по-прежнему имеют выбор между встроенным кодом и кодом программной части, но в модели кода программной части были реализованы значительные улучшения.

В ASP.NET 1.x разработчики имели выбор между встроенной моделью кода и моделью кода программной части. Код программной части можно реализовать с помощью атрибута Src или атрибута CodeBehind директивы @Page . В ASP.NET 2.0 разработчики по-прежнему имеют выбор между встроенным кодом и кодом программной части, но в модели кода программной части были реализованы значительные улучшения.

Улучшения в модели Code-Behind

Чтобы полностью понять изменения в модели кода программной части в ASP.NET 2.0, лучше быстро просмотреть модель, как она существовала в ASP.NET 1.x.

Модель Code-Behind в ASP.NET 1.x

В ASP.NET 1.x модель кода программной части состояла из ASPX-файла (Webform) и файла кода программной части, содержащего программный код. Два файла были подключены с помощью директивы @Page в ASPX-файле. Каждый элемент управления на странице ASPX имел соответствующее объявление в файле кода программной части в виде переменной экземпляра. Файл кода программной части также содержал код для привязки событий и созданный код, необходимый для конструктора Visual Studio. Эта модель работала довольно хорошо, но так как каждый элемент ASP.NET на aspX-странице требует соответствующего кода в файле кода программной части, не было истинного разделения кода и содержимого. Например, если конструктор добавил новый серверный элемент управления в ASPX-файл за пределами интегрированной среды разработки Visual Studio, приложение будет работать из-за отсутствия объявления для этого элемента управления в файле кода программной части.

Модель Code-Behind в ASP.NET 2.0

ASP.NET 2.0 значительно улучшает эту модель. В ASP.NET 2.0 код программной части реализуется с помощью новых разделяемых классов , предоставляемых в ASP.NET 2.0. Класс кода программной части в ASP.NET 2.0 определяется как разделяемый класс, то есть он содержит только часть определения класса. Оставшаяся часть определения класса динамически создается ASP.NET 2.0 с помощью ASPX-страницы во время выполнения или при предварительной компиляции веб-сайта. Связь между файлом кода программной части и страницей ASPX по-прежнему устанавливается с помощью директивы @ Page. Однако вместо атрибута CodeBehind или Src ASP.NET 2.0 теперь использует атрибут CodeFile. Атрибут Inherits также используется для указания имени класса для страницы.

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

<%@Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %>

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

public partial class _Default : System.Web.UI.Page

Примечание

C# и Visual Basic являются единственными управляемыми языками, которые в настоящее время поддерживают разделяемые классы. Таким образом, разработчики, использующие J#, не смогут использовать модель кода программной части в ASP.NET 2.0.

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

Примечание

Так как разделяемый класс для страницы ASPX является местом привязки событий, разработчики Visual Basic могут реализовать небольшое увеличение производительности, используя ключевое слово Handles в коде программной части для привязки событий. C# не имеет эквивалентных ключевое слово.

Новые атрибуты директивы @ page

ASP.NET 2.0 добавляет множество новых атрибутов в директиву @ Page. Следующие атрибуты являются новыми в ASP.NET 2.0.

Асинхронный режим

Атрибут Async позволяет настроить асинхронное выполнение страницы. Хорошо рассмотрим асинхронные страницы далее в этом модуле.

Асинхронное время ожидания

Указывает время ожидания для асинхронных страниц. Значение по умолчанию — 45 секунд.

Codefile

Атрибут CodeFile является заменой атрибута CodeBehind в Visual Studio 2002/2003.

CodeFileBaseClass

Атрибут CodeFileBaseClass используется в случаях, когда требуется, чтобы несколько страниц были производными от одного базового класса. Из-за реализации разделяемых классов в ASP.NET, без этого атрибута базовый класс, использующий общие общие поля для ссылки на элементы управления, объявленные на странице ASPX, не будет работать должным образом, так как ASP. Подсистема компиляции NETS автоматически создает новые элементы на основе элементов управления на странице. Таким образом, если требуется общий базовый класс для двух или более страниц в ASP.NET, необходимо указать базовый класс в атрибуте CodeFileBaseClass, а затем наследовать каждый класс pages от этого базового класса. Атрибут CodeFile также является обязательным при использовании этого атрибута.

CompilationMode

Этот атрибут позволяет задать свойство CompilationMode страницы ASPX. Свойство CompilationMode — это перечисление, содержащее значения Always, Auto и Never. Значение по умолчанию — Always. Параметр Автоматически по возможности не позволит ASP.NET динамически компилировать страницу. Исключение страниц из динамической компиляции повышает производительность. Однако если исключенная страница содержит код, который необходимо скомпилировать, при просмотре страницы будет возникать ошибка.

Включение проверки событий

Этот атрибут указывает, проверяются ли события обратной передачи и обратного вызова. Если этот параметр включен, аргументы для событий обратной передачи или обратного вызова проверяются, чтобы убедиться, что они были получены из серверного элемента управления, который их первоначально отображал.

Включение тем

Этот атрибут указывает, используются ли ASP.NET темы на странице. Значение по умолчанию — false. ASP.NET темы рассматриваются в модуле 10.

LinePragmas

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

MaintainScrollPositionOnPostback

Этот атрибут указывает, внедряется ли JavaScript на страницу для сохранения позиции прокрутки между обратными передачами. По умолчанию этот атрибут имеет значение false .

Если этот атрибут имеет значение true, ASP.NET добавит блок скрипта> для обратной <передачи, который выглядит следующим образом:

<script src="/website/WebResource.axd?d=jBAvpwrdOM_V_Xzeox989A2 &t=632653133849531250" type="text/javascript"> </script>

Обратите внимание, что src для этого блока скрипта — WebResource.axd. Этот ресурс не является физическим путем. При запросе этого скрипта ASP.NET динамически создает скрипт.

MasterPageFile

Этот атрибут задает файл master страницы для текущей страницы. Путь может быть как относительным, так и абсолютным. Главные страницы рассматриваются в модуле 4.

Тема таблицы стилей

Этот атрибут позволяет переопределять свойства внешнего вида пользовательского интерфейса, определенные темой ASP.NET 2.0. Темы рассматриваются в модуле 10.

Значение темы

Задает тему для страницы. Если значение не указано для атрибута StyleSheetTheme, атрибут Theme переопределяет все стили, применяемые к элементам управления на странице.

Значение заголовка

Задает заголовок страницы. Указанное здесь значение будет отображаться в элементе <title> отображаемой страницы.

ViewStateEncryptionMode

Задает значение перечисления ViewStateEncryptionMode. Доступные значения: Always, Auto и Never. Значение по умолчанию — Auto. Если для этого атрибута задано значение Auto, viewstate шифруется— элемент управления запрашивает его путем вызова метода RegisterRequiresViewStateEncryption .

Установка значений открытых свойств с помощью директивы @ Page

Еще одной новой возможностью директивы @ Page в ASP.NET 2.0 является возможность задать начальное значение открытых свойств базового класса. Предположим, например, что у вас есть открытое свойство SomeText в базовом классе, и вы хотите инициализировать его в Hello при загрузке страницы. Это можно сделать, просто задав значение в директиве @ Page следующим образом:

<%@Page Language="C#" SomeText="Hello!" Inherits="PageBase" %>

Атрибут SomeText директивы @ Page задает начальное значение свойства SomeText в базовом классе Hello!. В приведенном ниже видео показано, как задать начальное значение открытого свойства в базовом классе с помощью директивы @ Page.

Снимок экрана: окно Microsoft Visual Studio с красной стрелкой, обозначающей атрибут Some Text в одной из строк.

Открыть Full-Screen видео

Новые открытые свойства класса page

Следующие общедоступные свойства являются новыми в ASP.NET 2.0.

AppRelativeTemplateSourceDirectory

Возвращает относительный путь приложения к странице или элементу управления. Например, для страницы, расположенной в http://app/folder/page.aspx, свойство возвращает ~/folder/.

AppRelativeVirtualPath

Возвращает относительный путь к виртуальному каталогу к странице или элементу управления. Например, для страницы, расположенной по адресу http://app/folder/page.aspx, свойство возвращает ~/folder/page.aspx.

AsyncTimeout

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

ClientQueryString

Свойство, доступное только для чтения, которое возвращает часть строки запроса запрошенного URL-адреса. Это значение закодировано в URL-адресе. Для его декодирования можно использовать метод UrlDecode класса HttpServerUtility.

ClientScript

Это свойство возвращает объект ClientScriptManager, который можно использовать для управления ASP. Выброс nets для клиентского скрипта. (Класс ClientScriptManager рассматривается далее в этом модуле.)

EnableEventValidation

Это свойство определяет, включена ли проверка событий для событий обратного и обратного вызова. Если этот параметр включен, аргументы для событий обратной передачи или обратного вызова проверяются, чтобы убедиться, что они получены из серверного элемента управления, который их изначально отображал.

EnableTheming

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

Form

Это свойство возвращает HTML-форму на странице ASPX в виде объекта HtmlForm.

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

IdSeparator

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

IsAsync

Это свойство позволяет использовать асинхронные страницы. Асинхронные страницы рассматриваются далее в этом модуле.

IsCallback

Это свойство только для чтения возвращает значение true , если страница является результатом обратного вызова. Обратные вызовы рассматриваются далее в этом модуле.

IsCrossPagePostBack

Это свойство только для чтения возвращает значение true , если страница является частью перекрестной обратной передачи. Перекрестная обратная связь рассматривается далее в этом модуле.

Элементы

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

MaintainScrollPositionOnPostBack

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

master.

Это свойство, доступное только для чтения, возвращает ссылку на экземпляр MasterPage для страницы, к которой была применена master страница.

MasterPageFile

Возвращает или задает имя файла страницы master страницы. Это свойство можно задать только в методе PreInit.

MaxPageStateFieldLength

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

PageAdapter

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

PreviousPage

Возвращает ссылку на предыдущую страницу в случае обратной передачи Server.Transfer или перекрестной обратной передачи.

SkinID

Указывает обложку ASP.NET 2.0, применяемую к странице.

StyleSheetTheme

Это свойство получает или задает таблицу стилей, применяемую к странице.

TemplateControl

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

Тема

Возвращает или задает имя темы ASP.NET 2.0, примененной к странице. Это значение должно быть задано перед методом PreInit.

Заголовок

Это свойство получает или задает заголовок страницы, полученный из заголовка страницы.

ViewStateEncryptionMode

Возвращает или задает viewStateEncryptionMode страницы. Подробное описание этого свойства см. ранее в этом модуле.

Новые защищенные свойства класса page

Ниже приведены новые защищенные свойства класса Page в ASP.NET 2.0.

Адаптер

Возвращает ссылку на ControlAdapter, который отображает страницу на устройстве, запросив его.

AsyncMode

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

ClientIDSeparator

Это свойство возвращает символ, используемый в качестве разделителя при создании уникальных идентификаторов клиентов для элементов управления. Он предназначен для использования средой выполнения, а не непосредственно в коде.

PageStatePersister

Это свойство возвращает объект PageStatePersister для страницы. Это свойство в основном используется разработчиками ASP.NET элементов управления.

UniqueFilePathSuffix

Это свойство возвращает уникальный суффикс, который добавляется к пути к файлу для кэширования браузеров. Значение по умолчанию — __ufps= и 6-значное число.

Новые открытые методы для класса Page

Следующие открытые методы являются новыми для класса Page в ASP.NET 2.0.

AddOnPreRenderCompleteAsync

Этот метод регистрирует делегаты обработчика событий для асинхронного выполнения страницы. Асинхронные страницы рассматриваются далее в этом модуле.

ApplyStyleSheetSkin

Применяет к странице свойства таблицы стилей страниц.

ExecuteRegisteredAsyncTasks

Этот метод является асинхронной задачей.

GetValidators

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

RegisterAsyncTask

Этот метод регистрирует новую асинхронную задачу. Асинхронные страницы рассматриваются далее в этом модуле.

RegisterRequiresControlState

Этот метод сообщает ASP.NET, что состояние элемента управления страниц должно быть сохранено.

RegisterRequiresViewStateEncryption

Этот метод сообщает ASP.NET, что состояние просмотра страниц требует шифрования.

ResolveClientUrl

Возвращает относительный URL-адрес, который можно использовать для клиентских запросов изображений и т. д.

SetFocus

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

Отмена регистрацииRequiresControlState

Этот метод отменит регистрацию переданного ему элемента управления, так как больше не требует сохранения состояния элемента управления.

Изменения жизненного цикла страницы

Жизненный цикл страницы в ASP.NET 2.0 существенно не изменился, но есть некоторые новые методы, о которых следует знать. Жизненный цикл страницы ASP.NET 2.0 описан ниже.

PreInit (новая версия в ASP.NET 2.0)

Событие PreInit — это самый ранний этап жизненного цикла, к которому разработчик может получить доступ. Добавление этого события позволяет программно изменять темы ASP.NET версии 2.0, master страницы, свойства доступа для профиля ASP.NET 2.0 и т. д. Если вы находитесь в состоянии обратной передачи, важно понимать, что Viewstate еще не применено к элементам управления на данном этапе жизненного цикла. Таким образом, если разработчик изменяет свойство элемента управления на данном этапе, оно, скорее всего, будет перезаписано позже в жизненном цикле страниц.

Init

Событие Init не изменилось по сравнению с ASP.NET 1.x. Здесь необходимо прочитать или инициализировать свойства элементов управления на странице. На этом этапе master страницы, темы и т. д. уже применяются к странице.

InitComplete (новая версия 2.0)

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

PreLoad (новая версия 2.0)

Это событие вызывается после применения всех данных обратной передачи и непосредственно перед Page_Load.

Загрузить

Событие Load не изменилось по сравнению с ASP.NET 1.x.

LoadComplete (новая версия 2.0)

Событие LoadComplete является последним событием на этапе загрузки страниц. На этом этапе все данные обратной передачи и состояния просмотра были применены к странице.

Prerender

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

PreRenderComplete (новая версия 2.0)

На этапе PreRenderComplete все элементы управления были добавлены на страницу, и страница готова к просмотру. Событие PreRenderComplete — это последнее событие, созданное перед сохранением свойства просмотра страниц.

SaveStateComplete (новая версия 2.0)

Событие SaveStateComplete вызывается сразу после сохранения состояния просмотра страницы и состояния элемента управления. Это последнее событие перед отображением страницы в браузере.

Render

Метод Render не изменялся с ASP.NET 1.x. Здесь выполняется инициализация HtmlTextWriter и отрисовка страницы в браузере.

Обратная связь между страницами в ASP.NET 2.0

В ASP.NET 1.x обратная связь требовалась для публикации на той же странице. Обратная связь между страницами не разрешена. ASP.NET 2.0 добавляет возможность обратной публикации на другую страницу с помощью интерфейса IButtonControl. Любой элемент управления, реализующий новый интерфейс IButtonControl (Button, LinkButton и ImageButton в дополнение к сторонним пользовательским элементам управления), может воспользоваться этой новой функциональностью с помощью атрибута PostBackUrl. В следующем коде показан элемент управления Кнопка, который отправляет данные на вторую страницу.

<asp:Button ID="SubmitReport" PostBackUrl="~/Default.aspx" runat="server" Text="Submit Report" />

При обратной публикации страницы страница, которая инициирует обратную передачу, доступна через свойство PreviousPage на второй странице. Эта функция реализуется с помощью новой функции WebForm_DoPostBackWithOptions на стороне клиента, которая ASP.NET 2.0 отображается на странице, когда элемент управления возвращается на другую страницу. Эта функция JavaScript предоставляется новым обработчиком WebResource.axd, который выдает скрипт клиенту.

В приведенном ниже видео показано пошаговое руководство по перекрестной обратной отправке.

Снимок экрана: пошаговые видеоматериалы обратной передачи на нескольких страницах, на которой показана страница браузера в Интернете Обозреватель с параметром

Открыть видео Full-Screen

Дополнительные сведения о перекрестной обратной передаче

Viewstate

Возможно, вы уже спросили себя о том, что происходит с состоянием просмотра с первой страницы в сценарии обратной передачи между страницами. В конце концов, любой элемент управления, который не реализует IPostBackDataHandler, сохранит свое состояние через viewstate, поэтому, чтобы иметь доступ к свойствам этого элемента управления на второй странице межстраничной обратной передачи, необходимо иметь доступ к состоянию представления для страницы. ASP.NET 2.0 использует новое скрытое поле на второй странице с именем __PREVIOUSPAGE. Поле формы __PREVIOUSPAGE содержит состояние представления для первой страницы, что позволяет получить доступ к свойствам всех элементов управления на второй странице.

Обход элемента FindControl

В пошаговом руководстве по обратной связи между страницами я использовал метод FindControl, чтобы получить ссылку на элемент управления TextBox на первой странице. Этот метод хорошо подходит для этой цели, но FindControl является дорогостоящим и требует написания дополнительного кода. К счастью, ASP.NET 2.0 предоставляет альтернативу FindControl для этой цели, которая будет работать во многих сценариях. Директива PreviousPageType позволяет получить строго типизированную ссылку на предыдущую страницу с помощью атрибута TypeName или VirtualPath. Атрибут TypeName позволяет указать тип предыдущей страницы, а атрибут VirtualPath позволяет ссылаться на предыдущую страницу с помощью виртуального пути. После установки директивы PreviousPageType необходимо предоставить элементы управления и т. д. к которому требуется разрешить доступ с помощью открытых свойств.

Обратная связь между страницами задания 1

В этом задании вы создадите приложение, которое использует новую функцию обратной передачи между страницами ASP.NET 2.0.

  1. Откройте Visual Studio 2005 и создайте веб-сайт ASP.NET.

  2. Добавьте новую веб-форму с именем page2.aspx.

  3. Откройте файл Default.aspx в режиме конструктора и добавьте элементы управления Button и TextBox.

    1. Присвойте элементу управления Кнопка идентификатор SubmitButton , а элементу управления TextBox — идентификатор UserName.
    2. Задайте для свойства PostBackUrl элемента Button значение page2.aspx.
  4. Откройте файл page2.aspx в представлении источника.

  5. Добавьте директиву @ PreviousPageType, как показано ниже:

  6. Добавьте следующий код в Page_Load кода программной части page2.aspx:

    Response.Write(PreviousPage.UserName.Text);
    
  7. Выполните сборку проекта, щелкнув Сборка в меню Сборка.

  8. Добавьте следующий код в код программной части для Default.aspx:

    public TextBox txtUserName {
        get { return this.UserName; }
    }
    
  9. Измените Page_Load в файле page2.aspx следующим образом:

    Response.Write(PreviousPage.txtUserName.Text);
    
  10. Выполните построение проекта.

  11. Запустите проект.

  12. Введите свое имя в поле TextBox и нажмите кнопку.

  13. Каков результат?

Асинхронные страницы в ASP.NET 2.0

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

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

<%@ Page Async="true" %>

Этот атрибут сообщает ASP.NET реализовать IHttpAsyncHandler для страницы.

Следующим шагом является вызов метода AddOnPreRenderCompleteAsync в точке жизненного цикла страницы, предшествующей PreRender. (Этот метод обычно вызывается в Page_Load.) Метод AddOnPreRenderCompleteAsync принимает два параметра. BeginEventHandler и EndEventHandler. BeginEventHandler возвращает IAsyncResult, который затем передается в качестве параметра в EndEventHandler.

В приведенном ниже видео показано пошаговое руководство по асинхронным запросам страницы.

Снимок экрана: пошаговое видео асинхронного запроса страницы с экраном Microsoft Visual Code.

Открыть Full-Screen видео

Примечание

Асинхронная страница не отображается в браузере до завершения endEventHandler. Несомненно, но некоторые разработчики будут думать о асинхронных запросах как о асинхронных обратных вызовах. Важно понимать, что это не так. Преимущество асинхронных запросов заключается в том, что первый рабочий поток может быть возвращен в пул потоков для обслуживания новых запросов, тем самым уменьшая количество конфликтов из-за привязки операций ввода-вывода и т. д.

Обратные вызовы скриптов в ASP.NET 2.0

Веб-разработчики всегда искали способы предотвращения мерцания, связанного с обратным вызовом. В ASP.NET 1.x smartNavigation была наиболее распространенным методом предотвращения мерцания, но SmartNavigation вызывала проблемы у некоторых разработчиков из-за сложности ее реализации на клиенте. ASP.NET 2.0 устраняет эту проблему с помощью обратных вызовов скриптов. Обратные вызовы скрипта используют XMLHttp для отправки запросов к веб-серверу через JavaScript. Запрос XMLHttp возвращает XML-данные, которыми затем можно управлять с помощью модели DOM браузера. Код XMLHttp скрыт от пользователя с помощью нового обработчика WebResource.axd.

Для настройки обратного вызова скрипта в ASP.NET 2.0 необходимо выполнить несколько действий.

Шаг 1. Реализация интерфейса ICallbackEventHandler

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

public partial class _Default : System.Web.UI.Page, ICallbackEventHandler

Это также можно сделать с помощью директивы @ Implements следующим образом:

<%@ Implements Interface="System.Web.UI.ICallbackEventHandler" %>

Директива @ Implements обычно используется при использовании встроенного кода ASP.NET.

Шаг 2. Вызов GetCallbackEventReference

Как упоминалось ранее, вызов XMLHttp инкапсулируется в обработчик WebResource.axd. При отрисовке страницы ASP.NET добавит вызов WebForm_DoCallback, клиентского скрипта, предоставляемого WebResource.axd. Функция WebForm_DoCallback заменяет функцию __doPostBack для обратного вызова. Помните, что __doPostBack программным способом отправляет форму на странице. В сценарии обратного вызова необходимо предотвратить обратную передачу, поэтому __doPostBack будет недостаточно.

Примечание

__doPostBack по-прежнему отображается на странице в сценарии обратного вызова клиентского скрипта. Однако он не используется для обратного вызова.

Аргументы для функции WebForm_DoCallback на стороне клиента предоставляются через серверную функцию GetCallbackEventReference, которая обычно вызывается в Page_Load. Типичный вызов GetCallbackEventReference может выглядеть следующим образом:

// Set up the JavaScript callback string cbRef = cm.GetCallbackEventReference(this, "document.getElementById('ddlCompany').value", "ShowCompanyName", "null", true);

Примечание

В этом случае cm является экземпляром ClientScriptManager. Класс ClientScriptManager будет рассматриваться далее в этом модуле.

Существует несколько перегруженных версий GetCallbackEventReference. В этом случае аргументы будут следующими:

this

Ссылка на элемент управления, в котором вызывается GetCallbackEventReference. В этом случае это сама страница.

document.getElementById('ddlCompany').value

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

ShowCompanyName

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

null

Строка, представляющая клиентская функция, инициированная перед обратным вызовом сервера. В этом случае такого скрипта нет, поэтому аргумент имеет значение NULL.

true

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

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

WebForm_DoCallback('__Page',document.getElementById('ddlCompany').value, ShowCompanyName,null,null,true)

Обратите внимание, что сигнатура функции на клиенте немного отличается. Клиентская функция передает 5 строк и логическое значение. Дополнительная строка (в приведенном выше примере имеет значение NULL) содержит функцию на стороне клиента, которая будет обрабатывать любые ошибки при обратном вызове на стороне сервера.

Шаг 3. Перехватка события элемента управления Client-Side

Обратите внимание, что возвращаемое выше значение GetCallbackEventReference было присвоено строковой переменной. Эта строка используется для перехвата события на стороне клиента для элемента управления, инициирующего обратный вызов. В этом примере обратный вызов инициируется раскрывающимся списком на странице, поэтому я хочу подключить событие OnChange .

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

// Hook the JavaScript function to the onchange event of the dropdown ddlCompany.Attributes["onchange"] = String.Format("javascript:{0}", cbRef);

Напомним, что cbRef — это возвращаемое значение из вызова GetCallbackEventReference. Он содержит вызов WebForm_DoCallback, показанный выше.

Шаг 4. Регистрация скрипта Client-Side

Напомним, что вызов GetCallbackEventReference указал, что клиентский скрипт с именем ShowCompanyName будет выполняться при успешном выполнении обратного вызова на стороне сервера. Этот скрипт необходимо добавить на страницу с помощью экземпляра ClientScriptManager. (Класс ClientScriptManager будет рассмотрен далее в этом модуле.) Вы делаете это следующим образом:

System.Text.StringBuilder clientScript = new System.Text.StringBuilder(""); ClientScriptManager cm = Page.ClientScript; // Create the client script clientScript.Append("function ShowCompanyName(companyName)"); clientScript.Append("{"); clientScript.Append("document.getElementById('CoClicked').innerHTML = \"You chose \" + companyName + \".\";"); clientScript.Append("}"); cm.RegisterClientScriptBlock(this.GetType(), "showCo", clientScript.ToString(), true);

Шаг 5. Вызов методов интерфейса ICallbackEventHandler

ICallbackEventHandler содержит два метода, которые необходимо реализовать в коде. Это RaiseCallbackEvent и GetCallbackEvent.

RaiseCallbackEvent принимает строку в качестве аргумента и ничего не возвращает. Строковый аргумент передается из вызова на стороне клиента в WebForm_DoCallback. В этом случае это значение является атрибутом значения раскрывающегося списка ddlCompany. Код на стороне сервера должен быть помещен в метод RaiseCallbackEvent. Например, если обратный вызов выполняет запрос WebRequest для внешнего ресурса, этот код следует поместить в RaiseCallbackEvent.

GetCallbackEvent отвечает за обработку возврата обратного вызова клиенту. Он не принимает аргументов и возвращает строку. Возвращаемая строка будет передана в качестве аргумента клиентской функции, в данном случае ShowCompanyName.

Выполнив описанные выше действия, вы можете выполнить обратный вызов скрипта в ASP.NET 2.0.

Снимок экрана: пошаговое руководство по выполнению обратного вызова скрипта в точке S P NET 2 точки 0. Выделен раскрывающийся список Майкрософт.

Открыть Full-Screen видео

Обратные вызовы скриптов в ASP.NET поддерживаются в любом браузере, поддерживающем вызовы XMLHttp. Это включает в себя все современные браузеры, используемые сегодня. Интернет-Обозреватель использует объект XMLHttp ActiveX, а другие современные браузеры (включая предстоящий выпуск IE 7) используют встроенный объект XMLHttp. Чтобы программно определить, поддерживает ли браузер обратные вызовы, можно использовать свойство Request.Browser.SupportCallback . Это свойство возвращает значение true , если запрашивающий клиент поддерживает обратные вызовы скрипта.

Работа с клиентским скриптом в ASP.NET 2.0

Клиентские скрипты в ASP.NET 2.0 управляются с помощью класса ClientScriptManager. Класс ClientScriptManager отслеживает клиентские скрипты, используя тип и имя. Это предотвращает повторную вставку одного и того же скрипта на страницу программным способом.

Примечание

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

Методы ClientScriptManager должны быть знакомы всем текущим разработчикам ASP.NET:

RegisterClientScriptBlock

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

Существует две перегруженные версии этого метода. Три из четырех аргументов являются общими для них. К ним относятся:

type (string)

Аргумент type определяет тип скрипта. Как правило, рекомендуется использовать тип страницы (это. GetType()) для типа.

key (string)

Аргумент key является определяемым пользователем ключом для скрипта. Он должен быть уникальным для каждого скрипта. При попытке добавить скрипт с тем же ключом и типом уже добавленного скрипта он не будет добавлен.

script (string)

Аргумент script — это строка, содержащая фактический добавляемый скрипт. Рекомендуется использовать StringBuilder для создания скрипта, а затем использовать метод ToString() в StringBuilder для назначения аргумента скрипта .

Если вы используете перегруженный параметр RegisterClientScriptBlock, который принимает только три аргумента, необходимо включить в скрипт элементы скрипта (<script> и </script>).

Вы можете использовать перегрузку RegisterClientScriptBlock, которая принимает четвертый аргумент. Четвертый аргумент — это логическое значение, указывающее, следует ли ASP.NET добавлять элементы скрипта. Если этот аргумент имеет значение true, скрипт не должен включать элементы скрипта явным образом.

Используйте метод IsClientScriptBlockRegistered, чтобы определить, зарегистрирован ли скрипт. Это позволяет избежать попыток повторной регистрации уже зарегистрированного скрипта.

RegisterClientScriptInclude (новая версия 2.0)

Тег RegisterClientScriptInclude создает блок скрипта, который связывается с внешним файлом скрипта. Он имеет две перегрузки. Один из них принимает ключ и URL-адрес. Второй добавляет третий аргумент, указывающий тип .

Например, следующий код создает блок скрипта, который ссылается на jsfunctions.js в корне папки scripts приложения:

ClientScriptManager cm = Page.ClientScript; if(!cm.IsClientScriptIncludeRegistered("jsfunc")) { cm.RegisterClientScriptInclude(this.GetType(), "jsfunc", "/scripts/jsfunctions.js"); }

Этот код создает следующий код на отображаемой странице:

<script src="/scripts/jsfunctions.js" type="text/javascript"></script>

Примечание

Блок скрипта отображается в нижней части страницы.

Используйте метод IsClientScriptIncludeRegistered, чтобы определить, зарегистрирован ли скрипт. Это позволяет избежать попытки повторной регистрации скрипта.

RegisterStartupScript

Метод RegisterStartupScript принимает те же аргументы, что и метод RegisterClientScriptBlock. Скрипт, зарегистрированный с помощью RegisterStartupScript, выполняется после загрузки страницы, но до события OnLoad на стороне клиента. В версии 1.X скрипты, зарегистрированные с помощью RegisterStartupScript, размещались непосредственно перед закрывающим <тегом /form> , а скрипты, зарегистрированные с помощью RegisterClientScriptBlock, размещались сразу после открывающего <тега формы> . В ASP.NET 2.0 оба варианта помещаются непосредственно перед закрывающим <тегом /form> .

Примечание

Если вы регистрируете функцию с помощью RegisterStartupScript, эта функция не будет выполняться, пока вы явно не вызовете ее в клиентском коде.

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

Другие методы ClientScriptManager

Ниже приведены некоторые другие полезные методы класса ClientScriptManager.

GetCallbackEventReference См. обратные вызовы скриптов ранее в этом модуле.
GetPostBackClientHyperlink Возвращает ссылку JavaScript (javascript:<call>), которую можно использовать для обратной передачи из события на стороне клиента.
GetPostBackEventReference Возвращает строку, которую можно использовать для инициации обратной передачи из клиента.
GetWebResourceUrl Возвращает URL-адрес ресурса, внедренного в сборку. Должен использоваться в сочетании с RegisterClientScriptResource.
RegisterClientScriptResource Регистрирует веб-ресурс на странице. Это ресурсы, внедренные в сборку и обрабатываемые новым обработчиком WebResource.axd.
RegisterHiddenField Регистрирует скрытое поле формы на странице.
RegisterOnSubmitStatement Регистрирует клиентский код, который выполняется при отправке HTML-формы.