ASP.NET 实际上处理捕获、传输和解释事件的所有技术细节。当您在 Web 窗体页中创建事件处理程序时,无需考虑如何捕获事件信息以及如何使事件信息在代码中可用这些技术细节。相反,可以通过与在传统客户端窗体中大致相同的方式来创建事件处理程序。尽管如此,Web 窗体页中的事件处理还是有一些应该注意的方面。
内部事件集
由于大多数 Web 窗体事件在处理时都需要一次到服务器的往返行程,所以这些事件可能会影响窗体的性能。因此,服务器控件提供了一个有限的内部事件集(通常仅限于 Click 类型事件)。某些服务器控件支持一个特殊版本的 onchange 事件,该事件在控件的值出现更改时引发。例如,CheckBox Web 服务器控件在用户单击此框时会引发一个更改事件。服务器控件不支持经常发生(并且可能在用户不知道的情况下引发)的事件,如 onmouseover 事件。
注意 某些服务器控件支持一组更高级别的事件。例如,Calendar Web 服务器控件引发一个 SelectionChanged 事件,它是 Click 事件的一个更为抽象的版本。
事件参数
Web 和 HTML 服务器控件事件遵循事件处理程序方法的标准 .NET 框架模式。所有事件都传递两个参数:一个是表示引发此事件的对象的对象,另一个是包含所有事件特定信息的事件对象。第二个参数的类型通常是 System.EventArgs,但对于某些控件则是一种特定于该控件的类型。例如,对于 ImageButton Web 服务器控件,第二个参数的类型是 ImageClickEventArgs,它包含有关用户单击处所在的坐标位置的信息。
Web 服务器控件中的回发和非回发事件
在 Web 服务器控件中,某些事件(通常是 Click 事件)会导致窗体被回发到服务器。HTML 服务器控件和 Web 服务器控件(如 TextBox 控件)中的更改事件将被捕获,但不会立即导致发送。相反,它们会被该控件缓存,直到发送再次发生时为止。然后,当再次在服务器上处理该页时,将引发并处理所有的挂起事件。
注意 如果浏览器支持,验证控件可以使用客户端脚本检查用户输入,而无需到服务器的往返行程。有关详细信息,请参阅 Web 窗体的用户输入验证简介。
在服务器页处理期间,将首先处理事件,处理时没有特定的顺序。当处理完所有更改事件后,就会处理导致发送窗体的 Click 事件。
响应 ASP.NET 服务器控件中的客户端和服务器事件
在很大程度上,您主要会关心在服务器代码中引发的事件。但是,如果对于您的应用程序是适当的,也可以通过编写客户端脚本来处理 ASP.NET 服务器控件的客户端事件。
注意 不能使用 HTML 语法来绑定到 Web 服务器控件的客户端事件,而必须使用代码添加事件绑定属性。有关示例,请参阅下表。
例如,您可能具有已转换为 HTML 服务器控件的 HTML 图像按钮元素。通常,在 Web 窗体页中,您将在服务器代码中处理图像按钮的 Click 事件。但是,您可能还想要使用客户端代码在用户将鼠标移到图像上时更改该图像。可以通过为图像按钮的 onmouseover 事件创建客户端脚本来做到这一点。(在此示例中,假设使用支持 HTML 4.0 的浏览器,例如 Microsoft Internet Explorer 4.0 或更高版本。)
对于所有对应用程序的请求,都将引发应用程序事件。例如,当请求应用程序中的任何 Web 窗体页或 XML Web services 时,都将引发 Application_BeginRequest。该事件使您可以初始化资源,这些资源将用于对应用程序的每一请求。相应的 Application_EndRequest 事件使您有机会关闭或处置用于该请求的资源。
会话事件类似于应用程序事件(会话事件有 Session_OnStart 和 Session_OnEnd 事件),但会话事件由应用程序中每一个唯一的会话引发。当用户第一次从应用程序请求页时开始一个会话;当应用程序显式关闭该会话或当会话超时时结束该会话。