ASP.NET组件设计Step by Step(6)

回传事件映射到服务器端事件

asp.net 页面如果是通过 post 请求到服务器,框架将会遵行事件周期生成、调用控件,而控件(如果支持回传)则将加载回传数据,并且映射成控件的服务器端事件,就好像在重放客户的客户行为(客户按下一个按钮,却引发服务器端控件的 click 事件)。其中的机制如何?

如果一个控件需要处理回传事件,那么必须实现一个特定接口 IPostBackEventHandler 接口 :

public interface IPostBackEventHandler{

void RaisePostBackEvent(string eventArgument);

}

以及另外一个接口:

IPostBackDataHandler

{

bool LoadPostData( string postDataKey, NameValueCollection postCollection);

void RaisePostDataChangedEvent();

}

一旦控件实现了这些接口,页面框架就会自动在 PostBack 数据完成后,调用控件的此接口 IPostBackDataHandler 。 LoadPostData ,从而让控件读取 post 上来的数据。 PostDataKey 为 PostBack 数据中的命名键名,通过 NameValueCollection[postDataKey] 可以获得页面框架传递给控件的值。控件应当读取此值,进行自己内部状态更新,反映状态变化。如果控件返回真,表示服务器控件状态改变,此时页面框架会立即调用此控件的 RaisePostDataChangedEvent 方法。此时,控件应当自己定义该引发那些服务器控件对外提供的事件。这些事件往往是控件编程者精心设计留给使用这控键的 aspx 编程者的代码舞台。

至于另一个接口 IPostBackEventHandler ,也是回传时候服务器调用的接口。我们知道每一个控件都有一个 UniqueID ,当客户端触发一个可以引起回传的客户端事件(譬如按下了 submit 按钮),那么自然 HTTP Post 数据到服务器端,服务器页面框架进行到 PostBack 处理时候,会检索控件是否支持 IpostBackEventHandler 接口,并且查找控件的 UniqueID 发现支持就立即调用此接口的 RaisePostBackEvent 方法,表示 UniqueID 的控件发生了一个需要捕获的事件。很明显,并非客户端所有事件都可以投射到服务器端,只能够是能够引发 Post Back (也就是能够提交表单数据到服务器的事件)的事件和控件。注意,这里严格要求了 UniqueID 必须在服务器端和客户端对应一致,否则无法映射事件。

值得控件编写者注意的是,如果要实现接口,需要如下实现接口,而不是通常的仅仅接口方法名同名即可:

void IPostBackEventHandler.RaisePostBackEvent(string eventArgument)

{

……

}

也就是说,接口针对页面框架实现的,也由页面框架调用。

另一方面,在客户端,能够引起回传的实际上仅有 2 个 HTML 元素

 1<inoput type="submit"> 和  <input );="" <input="" argument="" control="" control,="" getpostbackclientevent(="" getpostbackclienthyperlink(="" getpostbackeventreference="" getpostbackeventreference(control);="" getpostbackeventreference(control,="" html="" javascript:="" name="”__EVENTTARGET”" page="" public="" string="" string);="" type="”hidden”" value="””" 中包含脚本,并且脚本中藏有如下隐含变量:="" 如果一个控件确定通过以上方法确保客户端引发回传事件,那么控件引用页将导致最终输出到客户端的="" 将="" 类提供了一系列的方法来帮助实现其他可引发回传的途径:="" 获取对客户端脚本函数的引用,该函数在被调用时将导致服务器回发到窗体。="" 获取对客户端脚本函数的引用,调用该函数将使服务器="" 调用的返回的开头,从而使服务器上可以进行超级链接回发处理。="" 追加到从="" ,但是通过客户端脚本,其他客户端事件也可导致回传数据到服务器端。=""/>
 2<input name="”__EVENTARGUMENT”" type="”hidden”" value="””"/>
 3<script language="”javascript”">
 4
 5<!— 
 6
 7function __doPostBack(eventTarget,eventArgument) 
 8
 9{ 
10
11var theform=document._ct10; 
12
13theform.__EVENTTARGET.value= eventTarget; 
14
15theform.__EVENTARGUMENT.value= eventArgument; 
16
17} 
18
19\-- >
20
21</script>
22
23任何客户端脚本只要合法调用了  __doPostBack  方法即可实现回传到服务器端,并且服务器端也知道了是引发了那一个  UniqueID  得控件的事件。</inoput>
Published At
Categories with Web编程
Tagged with
comments powered by Disqus