添加控件行为 到目前为止,我们设计的两个
控件都是简单、静态的
控件。也就是说,这些
控件不会完成利用普通的内置
控件或简单用户
控件 (.ascx) 无法完成的任何操作。构建自定义服务器
控件的主要原因之一就是要提供使用现有
控件集无法执行的新功能。
事件模型 在 Web 窗体页面中,与服务器
控件关联的事件由客户端引发并由 Web 服务器处理。对于在客户机上由服务器
控件引发的事件,ASP.NET 2.0 事件模型收集有关请求的信息,并使用 HTTP Post 将详细信息传递到服务器。服务器上的 Page Framework 对该公告作出解释以确定发生的事件,然后调用适当的处理
程序方法。
 图 8. 典型的服务器 控件事件 |
ASP.NET 2.0 可处理几乎所有捕获、传输和解释事件的方法。详细信息对于开发人员来说是隐藏的,开发人员只需要关心服务器上的处理
程序方法的实现。
大多数服务器事件要求一个到服务器的往返以便进行处理,因此支持有限数量的单击类型事件。出于性能原因,不支持鼠标悬停和其他内部事件。
回发事件 ASP.NET 2.0 中的很多服务器
控件都生成回发事件。回发事件将页面传递到服务器以便进行处理。这是一个非常昂贵的操作,因为它要求页面通过网络进行传递。
回发模型自从 ASP.NET 1.x 就没有进行过显著更改。为了创建一个可处理回发的
控件,您的
控件必须实现 IPostBackDataHandler 接口,它定义了两个方法:
1) LoadPostData — 该方法处理您
控件的回发数据。
2) RaisePostDataChangedEvent — 该事件通知应用
程序由于处理回发数据,该
控件的状态已经更改。
PostDataChangedEvent 调用引发的事件必须在该
控件内部定义。然后,用户可以在开发过程中编写实际的事件方法。
非回发事件 某些服务器
控件支持非回发事件。此类事件会更改
控件的状态,但并不要求立即进行处理。这些事件由
控件缓存,而不是立即传递到服务器以进行处理。例如,ListBox
控件可能包含很多元素。如果用户选择一个不同的元素,那么
控件将在不通知服务器的情况下显示适当的更改并记住其新状态。在张贴包含 ListBox 的窗体之后,ListBox
控件将提交事件(选定的项)。
非回发事件的默认行为可以通过设置 AutoPostBack 属性进行更改。如果 AutoPostBack 设置为 true,那么通常由客户端缓存的事件发送信号通知服务器立即进行处理。启用 AutoPostBack 的
控件要求客户机允许运行脚本。
ASP.NET 2.0 并未以任何明显的方式更改该模型。
回调和带外请求 标准的 Web 协议设计用于同步通讯。每个请求接收响应的速度与服务器生成数据的速度同样快。但是,很多任务都需要带外 请求,例如同一时间访问第三方资源。这些请求未处于浏览器和 Web 服务器之间的标准通讯带区内,因此被认为是带外请求。
ASP.NET 1.x 中的带外 进行带外数据请求的要求提示众多开发人员可以创造性地使用可用资源来获得所需的功能。例如,通过使用 ActiveX
组件和 JavaScript,开发人员能够进行外部 HTTP 调用而无需完全回发到服务器。下面的 JavaScript 示例说明了可以与 ASP.NET 1.x 一起使用的带外 HTTP 请求。
function RetrieveGoogleFrontPage() { var XmlHttp = new ActiveXObject("Msxml2.XMLHTTP.4.0"); XmlHttp.Open("GET", "http://www.fakedomain.com", false); XmlHttp.Send(); return XmlHttp.responseText; } |
这种机制的一个缺点就是 XmlHttp.responseText 包含该请求的完整结果。开发人员将必须编写只返回商业数据的特殊页面,否则响应会由于不必要的标记而非常庞大。
ASP.NET 2.0 中的带外 ASP.NET 2.0 概括了 XmlHttp 对象的使用并提供了内置的回调功能。新系统的核心有两个关键项:System.Web.UI.ICallbackEventHandler 和 Page.GetCallbackEventReference 方法。
Page.GetCallbackEventReference 方法及其重载用于指定将参与回调事件的 JavaScript 方法。
public string GetCallbackEventReference( Control control, string argument, string clientCallback, string context ); |
上述代码显示了 GetCallBackEventReference 所需的最小参数集,这些参数将在下面进行详细说明。
Control — control 参数确定实现 RaiseCallbackEvent 方法的 ICallbackEventHandler。
Argument — argument 字符串包含客户端脚本。评估该脚本的结果将作为 eventArgument 参数传递到 RaiseCallbackEvent。
ClientCallback — clientCallback 参数包含客户端事件处理
程序的名称,该处理
程序将接收成功服务器事件的结果。
Context — context 参数包含一个客户端脚本。评估该脚本的结果将传递到客户端事件处理
程序,该处理
程序在 clientCallback 参数中指定为 context 参数。
CallbackEventHandler 和 GetCallbackEventReference 方法相结合在客户端和服务器之间产生异步通讯。