ASP.NET组件设计Step by Step(6)
点击次数:17 次 发布日期:2008-11-26 23:43:23 作者:源代码网
|
源代码网推荐 源代码网推荐 如果一个控件需要处理回传事件,那么必须实现一个特定接口 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元素<inoput type=submit >和<input type=image,但是通过客户端脚本,其他客户端事件也可导致回传数据到服务器端。Page类提供了一系列的方法来帮助实现其他可引发回传的途径: 源代码网推荐 源代码网推荐 源代码网推荐 源代码网推荐public string GetPostBackClientEvent( 源代码网推荐 源代码网推荐 Control control, 源代码网推荐 源代码网推荐 string argument 源代码网推荐 源代码网推荐); 源代码网推荐 源代码网推荐获取对客户端脚本函数的引用,该函数在被调用时将导致服务器回发到窗体。 源代码网推荐 源代码网推荐 源代码网推荐 源代码网推荐public string GetPostBackClientHyperlink( 源代码网推荐 源代码网推荐 Control control, 源代码网推荐 源代码网推荐 string argument 源代码网推荐 源代码网推荐);将 javascript: 追加到从 GetPostBackEventReference 调用的返回的开头,从而使服务器上可以进行超级链接回发处理。 源代码网推荐 源代码网推荐 源代码网推荐 源代码网推荐 public string GetPostBackEventReference(Control); 源代码网推荐 源代码网推荐public string GetPostBackEventReference(Control, string); 源代码网推荐 源代码网推荐获取对客户端脚本函数的引用,调用该函数将使服务器 源代码网推荐 源代码网推荐 源代码网推荐 源代码网推荐 如果一个控件确定通过以上方法确保客户端引发回传事件,那么控件引用页将导致最终输出到客户端的HTML中包含脚本,并且脚本中藏有如下隐含变量: 源代码网推荐 源代码网推荐<input type=”hidden” name=”__EVENTTARGET” value=””> 源代码网推荐 源代码网推荐<input type=”hidden” name=”__EVENTARGUMENT” value=””> 源代码网推荐 源代码网推荐<script language=”javascript”> 源代码网推荐 源代码网推荐<!— 源代码网推荐 源代码网推荐function __doPostBack(eventTarget,eventArgument) 源代码网推荐 源代码网推荐 { 源代码网推荐 源代码网推荐 var theform=document._ct10; 源代码网推荐 源代码网推荐 theform.__EVENTTARGET.value= eventTarget; 源代码网推荐 源代码网推荐 theform.__EVENTARGUMENT.value= eventArgument; 源代码网推荐 源代码网推荐 } 源代码网推荐 源代码网推荐-- > 源代码网推荐 源代码网推荐</script> 源代码网推荐 源代码网推荐任何客户端脚本只要合法调用了__doPostBack方法即可实现回传到服务器端,并且服务器端也知道了是引发了那一个UniqueID得控件的事件。 源代码网推荐 源代码网推荐 源代码网推荐 源代码网推荐作者Blog:http://blog.csdn.net/shanhe/ 源代码网推荐 源代码网供稿. |
