ASP.NET 中有一个重要功能,允许您通过与客户端应用程序中类似的、基于事件的模型来对网页进行编程。举一个简单的例子,例如,可以向 ASP.NET 网页中添加一个按钮,然后为该按钮的 Click 事件编写事件处理程序。尽管这种情况在仅使用客户端脚本(在动态 HTML 中处理按钮的 onclick 事件)的网页中很常见,但 ASP.NET 将此模型引入到了基于服务器的处理中。
与传统 HTML 页或基于客户端的 Web 应用程序中的事件相比,由 ASP.NET 服务器控件引发的事件的工作方式稍有不同。导致差异的主要原因在于事件本身与处理该事件的位置的分离。在基于客户端的应用程序中,在客户端引发和处理事 件。但是,在 ASP.NET 网页中,与服务器控件关联的事件在客户端(浏览器)上引发,但由 ASP.NET 页在 Web 服务器上处理。
对 于在客户端引发的事件,ASP.NET Web 控件事件模型要求在客户端捕获事件信息,并通过 HTTP POST 将事件消息传输到服务器。页必须解释该 POST 以确定所发生的事件,然后在要处理该事件的服务器上调用代码中的相应方法。
ASP.NET 处理捕获、传输和解释事件等任务。当您在 ASP.NET 网页中创建事件处理程序时,通常无需考虑捕获事件信息并使其可用于您的代码的方式。创建事件处理程序的方式与您在传统的客户端窗体上的创建方式大体相同。 尽管如此,ASP.NET 网页中的事件处理仍有一些您应该注意的地方。
由于大多数 ASP.NET 服务器控件事件要求到服务器的往返行程才能进行处理,因此这些事件可能会影响页的性能。因此,服务器控件仅提供有限的一组事件,通常仅限于 Click 类型事件。一些服务器控件支持 Change 事件。例如,CheckBox Web 服务器控件在用户单击该框时引发服务器代码中的 CheckedChanged 事件。一些服务器控件支持更抽象的事件。例如,Calendar Web 服务器控件引发 SelectionChanged 事件,该事件是 Click 事件的更抽象版本。
对于服务器控件,不支持经常发生(并且是在用户不知道的情况下引发)的事件,如 onmouseover 事件。ASP.NET 服务器控件仍然可以为这些事件调用客户端处理程序,后文中的 ASP.NET Web 服务器控件事件模型将对此进行说明。
控件和页本身还会在每个处理步骤引发生命周期事件,例如 Init、Load 和 PreRender。您可以在应用程序中利用这些生命周期事件。例如,在页的 Load 事件中,可以设置控件的默认值。
事件参数
基于服务器的 ASP.NET 页和控件事件遵循事件处理程序方法的标准 .NET Framework 模式。所有事件都传递两个参数:表示引发事件的对象,以及包含任何事件特定信息的事件对象。第二个参数通常是 EventArgs 类型,但对于某些控件而言是特定于该控件的类型。例如,对于 ImageButton Web 服务器控件,第二个参数是 ImageClickEventArgs 类型,它包括有关用户单击位置的坐标的信息。
|
|
|---|
页 事件(例如,该页的 Load 事件)可以接受两个标准参数,但不会通过这些参数传递值。 |
服务器控件中的回发和非回发事件
在服务器控件中,某些事件(通常是 Click 事件)会导致页被立即回发到服务器。HTML 服务器控件和 Web 服务器控件(如 TextBox 控件)中的 Change 事件不会立即导致页被发送。它们在下一次发生发送操作时引发。
|
|
|---|
如 果浏览器支持,验证控件可以使用客户端脚本检查用户输入,而无需到服务器的往返行程。有关详细信息,请参见 在 ASP.NET 网页中验证用户输入。 |
回发页之后,会引发该 页的初始化事件(Page_Init 和 Page_Load),然后处理控件事件。如果您对于页事件处理方面的知识没有比 较透彻的了解,则不要创建依赖于按特定顺序引发的 Change 事件的应用程序逻辑。有关详细信息,请参见 ASP.NET 页生命周期概述。
如果它对于您的应用程序很有用,则您可以进行指定,让 Change 事件导致页发送。支持 Change 事件的 Web 服务器控件包括 AutoPostBack 属性。当该属性为 true 时,控件的更改事件会导致页立即发送,而不等待 Click 事件。例如,默认情况下,CheckBox 控件的 CheckedChanged 事件不会导致该页被提交。但是,如果将控件的 AutoPostBack 属性设置为 true,则一旦用户单击该复选框,该页便会立即被发送到服务器进行处理。
|
|
|---|
为 了使 AutoPostBack 属性正常工作,用户的浏览器必须设置为允许运行脚本。这在大多数情况下是默认设置。但是,有些用户出于安全性方面的原因禁止运行脚本。有关详细信息,请参 见 ASP.NET 网页中的客户端脚本。 |
转发的事件
诸如 Repeater、DataList、GridView、FormView 和 DetailsView 控件之类的 Web 服务器控件可以包含自身引发事件的按钮控件。例如,GridView 控件中的每一行都可以包含由模板动态创建的一个或多个按钮。
与每个按钮各自引发一个事件不同,来自嵌套控件的事件被转发到容器控件。然后, 容器通过能够使您发现引发原始事件的单独控件的参数,反过来引发一个一般事件 ItemCommand。通过响应此单个事件,可以避免不必 要地为子控件编写单独的事件处理程序。
ItemCommand 事件包括两个标准事件参数,即引用事件源的对象和包含特定于事件的信息的事件对象。
|
|
|---|
GridView、DataList 和其他数据控件支持作为转发事件的特殊情况的其他事件,例如,EditCommand、DeleteCommand 和 UpdateCommand。 |
对 于按钮,可以使用 CommandArgument 属性向事件处理程序传递一个用户指定的字符串,以帮助您确定引发该事件的按钮。例如,在 DataList 控件中,按钮引发 ItemCommand 事件。可以将每个按钮的 CommandArgument 属性设置为一个不同的值 - 可能一个按钮的值为“ShowDetails”,而另一个按钮的值为“AddToShoppingCart”- 随后在事件处理程序中捕获这些值。
将事件绑定到方法
一个事件就是一条消息,例如“某按钮已被单击”。在应用程序中,必须将消息转换成 代码中的方法调用。事件消息与特定方法(即事件处理程序)之间的绑定是通过事件委托来实现的。有关更多信息,请参见事 件和委托。
在 ASP.NET 网页中,如果控件是以声明(标记)的方式在页中创建的,则您不需要显式地对委托进行编码。事件绑定可以通过各种方法来完成,具体方法取决于要绑定的事件以 及所使用的编程语言。有关详细信息,请参见如 何:在 ASP.NET 网页中创建事件处理程序。
绑定控件事件
对于在页上声明的控件,可以通过在控件的标记中设置属性 (Attribute/Property) 将事件绑定到方法。下面的代码示例演示如何将 ASP.NET Button 控件的 Click 事件绑定到名为 ButtonClick 的方法。
如果页已编译,ASP.NET 将查找名为 ButtonClick 的方法,并确认该方法具有适当的签名。该方法接受两个参数,一个是 Object 类型,另一个是 EventArgs 类型。然后 ASP.NET 可以自动将事件绑定到方法。
在 Visual Basic 中,可以选择在事件处理程序声明中使用 Handles 关键字将事件绑定到方法,如下面的代码示例所示: