Поделиться через


Модель событий серверного веб-элемента управления ASP.NET

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

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

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

Модель событий элемента управления ASP.NET требует захвата сведений о событии, вызванном на клиенте, и передачи сообщения о событии серверу с помощью HTTP. Необходимо, чтобы страница интерпретировала обратный запрос и определила, какое событие произошло, а также вызвала бы в коде на сервере необходимый метод для обработки события.

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

Набор событий для серверных элементов управления и страниц

Так как для большинства событий элементов управления ASP.NET требуется цикл обработки на сервере, это может повлиять на производительность страницы. По этой причине серверные элементы управления содержат ограниченный набор событий, которые обычно являются событиями нажатия. Некоторые серверные элементы управления поддерживают события изменений. Например, серверный веб-элемент управления CheckBox создает событие CheckedChanged, если пользователь снимает или отмечает флажок. Некоторые серверные элементы управления поддерживают более абстрактные события. Например, серверный веб-элемент управления Calendar создает событие SelectionChanged, более абстрактную версию события нажатия.

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

Элементы управления и сама страница также создают события жизненного цикла на каждом шаге обработки, например, Init, Load и PreRender. Можно воспользоваться преимуществами подобных событий в приложении. Например, в событии Load страницы можно задать значения по умолчанию для элементов управления.

Аргументы события

События страницы и элементов управления ASP.NET следуют стандартному образцу .NET Framework для методов обработчиков событий. Все события передают два аргумента: объект, который вызвал событие, и объект события, который содержит все сведения о данном событии. Второй аргумент обычно принадлежит к типу EventArgs, но иногда может принадлежать к типу, характерному для данного элемента управления. Например, в случае с серверным веб-элементом управления ImageButton второй аргумент принадлежит к типу ImageClickEventArgs, который включает сведения о координатах щелчка.

y3bwdsh3.alert_note(ru-ru,VS.90).gifПримечание.

События для страницы (например, события Load страницы) могут принимать два стандартных аргумента, но значения в них не передаются.

Отправленные и неотправленные назад события в серверных элементах управления

В серверных элементах управления некоторые события (обычно событие нажатия) вызывают немедленную отправку страницы назад на сервер. События изменения в серверных элементах управления HTML и в серверных веб-элементах управления, например, элемент управления TextBox, захватываются, но не вызывают отправки. Вместо этого они создаются при следующем выполнении отправки.

y3bwdsh3.alert_note(ru-ru,VS.90).gifПримечание.

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

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

Если это полезно для приложения, можно настроить события изменения таким образом, чтобы они вызывали отправку страницы. Серверные веб-элементы управления, которые поддерживают событие изменения, включают свойство AutoPostBack. Если данное свойство имеет значение true, то событие изменения элемента управления вызывает немедленную отправку формы, не дожидаясь события нажатия. Например, по умолчанию событие CheckedChanged элемента управления CheckBox не вызывает отправки страницы. Однако если для свойства AutoPostBack элемента управления указать значение true, то страница будет отправлена на сервер для обработки непосредственно после установки пользователем флажка.

y3bwdsh3.alert_note(ru-ru,VS.90).gifПримечание.

Чтобы свойство AutoPostBack работало соответствующим образом, в обозревателе пользователя должны быть разрешены сценарии. В большинстве случаев они разрешены по умолчанию. Однако некоторые пользователи отключают сценарии по соображениям безопасности. Дополнительные сведения см. в разделе Клиентский сценарий на веб-страницах ASP.NET.

Перенаправленные события

Серверные веб-элементы управления, такие как Repeater, DataList, GridView, FormView и DetailsView, могут содержать кнопки, которые сами могут создавать события. Например, каждая строка элемента управления GridView может содержать одну или более кнопок, динамически созданных шаблонами.

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

Событие ItemCommand включает два стандартных аргумента события: объект, ссылающийся на источник события, и объект события, содержащий сведения о данном событии.

y3bwdsh3.alert_note(ru-ru,VS.90).gifПримечание.

Элементы управления GridView, DataList и другие поддерживают дополнительные события, такие как EditCommand, DeleteCommand и UpdateCommand, которые представляют собой особые случаи перенаправленных событий.

При использовании кнопок свойство CommandArgument можно применять для передачи обработчику событий указанной пользователем строки, которая позволит определить, какая кнопка вызвала событие. Например, в элементе управления DataList кнопка создает событие ItemCommand. Свойство CommandArgument каждой отдельной кнопки может иметь разные значения: для одной кнопки это может быть значение ShowDetails, для другой — AddToShoppingCart, которые затем захватываются в обработчике событий.

Привязка событий к методам

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

На веб-страницах ASP.NET необязательно явно писать код для делегатов, если элемент управления создается декларативно (в разметке) на странице. Привязка событий выполняется различными способами в зависимости то того, какое события привязывается и какой язык программирования используется. Дополнительные сведения см. в разделе How to: Create Event Handlers in ASP.NET Web Pages.

Привязка событий элемента управления

Для элементов управления, объявленных на странице, событие можно привязать к методу, задав атрибут (свойство) в разметке элемента управления. В следующем примере показано, как выполнить привязку события Click элемента управления Button ASP.NET к методу ButtonClick.

<asp:button id="SampleButton" runat="server" 
   text="Submit" onclick="ButtonClick" />

Когда страница компилируется, ASP.NET ищет метод с именем ButtonClick и проверяет, что у метода соответствующая сигнатура (он принимает два аргумента, один типа Object и другой типа EventArgs). Затем ASP.NET выполняет автоматическую привязку события к методу.

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

Private Sub ButtonClick(ByVal sender As System.Object, _
    ByVal e As System.EventArgs) Handles SampleButton.Click

Привязка событий страницы

ASP.NET создает события жизненного цикла, такие как Init, Load, PreRender и другие. По умолчанию можно выполнить привязку событий страницы к методам, используя правило именования Page_имя события. Например, для создания обработчика событий Load можно создать метод с именем Page_Load. Во время компиляции ASP.NET ищет методы на основе этого правила именования и автоматически выполняет привязку события и метода. Можно использовать правило именования Page_имя события для любого события, предоставленного классом Page.

y3bwdsh3.alert_note(ru-ru,VS.90).gifПримечание.

Для методов, обрабатывающих события страницы, никакие аргументы не требуются.

При желании обработчики событий также могут быть созданы напрямую. Автоматическая привязка событий страницы на основе правила именования методов управляется свойством страницы AutoEventWireup. По умолчанию значение этого свойства равно true и ASP.NET выполняет автоматическую привязку, описанную выше. Этому свойству можно присвоить значение false, добавив атрибут AutoEventWireup=false в директиве @ Page. Затем можно создать методы с любым именем и явно выполнить их привязку к событиям страницы. В Visual Basic можно использовать ключевое слово Handles, как в следующем примере кода:

Sub MyPageLoad(sender As Object, e As EventArgs) Handles MyBase.Load

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

y3bwdsh3.alert_note(ru-ru,VS.90).gifПримечание.

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

Явная привязка динамических элементов управления

Если элементы управления создаются при объявлении их в разметке, можно выполнить привязку событий к методам, используя атрибут (например, onclick), или, в Visual Basic, используя ключевое слово Handles. При динамическом создании элементов управления (в коде) нельзя использовать эти методы, так как у компилятора нет ссылки на элемент управления во время компиляции.

В этом случае необходимо использовать явную привязку событий. В Visual Basic можно использовать оператор AddHandler для привязки события динамического элемента управления к существующему методу. В C# необходимо создать делегат и связать его с событием элемента управления. В следующем примере кода демонстрируется привязка метода с именем ButtonClick к событию Click кнопки:

Dim b As New Button
b.Text = "Click"
AddHandler b.Click, AddressOf ButtonClick
Placeholder1.Controls.Add(b)
Button b = new Button;
b.Text = "Click";
b.Click += new System.EventHandler(ButtonClick);
Placeholder1.Controls.Add(b);

Ответ на клиентские и серверные события в серверных элементах управления ASP.NET

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

События приложения и сеанса

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

  • События приложения вызываются для всех запросов к приложению. Например, событие BeginRequest объекта HttpApplication (событие Application_BeginRequest) вызывается при запросе в приложении веб-страницы ASP.NET или веб-службы XML). Это событие позволяет инициализировать ресурсы, которые будут использоваться для каждого запроса к приложению. Соответствующее ему событие EndRequest объекта HttpApplication (Application_EndRequest) позволяет закрывать или удалять ресурсы, используемые для запроса.

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

    y3bwdsh3.alert_note(ru-ru,VS.90).gifПримечание.

    Событие Session_End не возникает ни при каких обстоятельствах. Дополнительные сведения см. в разделе End.

Обработчики для этих типов событий можно создавать в файле Global.asax. Дополнительные сведения см. в разделах Общие сведения о жизненном цикле приложения ASP.NET для IIS 5.0 и 6.0 и Синтаксис Global.asax.

См. также

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

Общие сведения об управлении состоянием ASP.NET

Другие ресурсы

How to: Create Event Handlers in ASP.NET

Обработка событий сервера на страницах ASP.NET