ITPub博客

首页 > Linux操作系统 > Linux操作系统 > 【dinghao】asp.net控件开发(二)实现回传之IPostBackEventHandle

【dinghao】asp.net控件开发(二)实现回传之IPostBackEventHandle

原创 Linux操作系统 作者:iDotNetSpace 时间:2008-06-05 08:43:50 0 删除 编辑

两个基本概念:
1、什么是回传?
回传就是HttpPost请求,或者在Url中带有数据的HttpGet请求,通过网页源代码可以看到:
method="post" action="页面名",这说明了即使是Get也会被转到Post。
2、IPostBackEventHandle接口的作用是什么?
接口的实质就是把客户端事件映射到服务器端事件,有两类映射方式:
1、通过UniqueID。
2、通过脚本。
通过两个例子分析两种映射方式:
一、通过UniqueID
SimpleButton,模拟Button实现事件回传,以UniqueID方式回传到服务器端


让我们看看客户端单击事件是如何发送到服务器的:
首先,让我们从页面被编译成类似App_web_tingluzi.dll的临时文件开始说起,在此之前Application内部类CallHandlerExecutionStep的Excute()方法执行后,会转到Page的生命期。经过一系列的ProcessRequest、编译(JIT)App_web_tingluzi.dll临时文件,然后就会编译(JIT)我们写的控件的程序集了本例中是SimpleButton.dll,正式进入控件的生命期。(如果有Global,会在web页前被编译为Global.dll)
如果想了解详细的信息可以看dudu的:
解读System.Web.UI.Page中关键方法ProcessRequestMain()
注:基于1.1,不过基本的东西还是一样的
http://www.cnblogs.com/dudu/archive/2005/10/21/259328.html
ASP.NET 2.0运行时简要分析
http://www.cnblogs.com/dudu/archive/2006/01/14/317016.html
客户端事件映射到服务器端事件的流程:
从Page的核心方法ProcessRequestMain()开始,它处理Page的整个生命期(详细的可看dudu的分析)。
现在只关注和回传有关的内容,下面是涉及到回发的页面生命期,从Init结束开始:
1、LoadAllState
(包含LoadPageStateFromPersistenceMedium,LoadViewStateRecursive)
2、ProcessPostData //通过判断控件是否实现PostBackEventHandler标记其是否引发Postback
3、PreLoad(非PostBack)
4、Load(非PostBack)
5、ProcessPostData
6、RaiseChangedEvents
7、RaisePostBackEvent//通过显示接口调用客户端的RaisePostBackEvent,并且实现了两类绑定:UniqID和客户端脚步
下面深入的了解一下Pages是如何实现自动映射的:
首先是ProcessPostData方法,他保证了回传能够正确的进行,是回传的基础:
下面是有关ProcessPostData的伪代码:
参数说明:postDate:Form回发给服务器的内容包含form中引起回传的控件、RequestQury的值、_VIEWSTATE、以及通过脚本回传给服务期的数据。通过Page.RequestValueCollection可以看到集合的值。

//postData指:Page.RequestValueCollection。bool标记是Load前调用的还是load后调用的
private IPostBackEventHandler _registeredControlThatRequireRaiseEvent;
private void ProcessPostData(NameValueCollection postData, bool fBeforeLoad)
IPostBackDataHandler handler1 
= control1.PostBackDataHandler;
                            
if (handler1 == null)
                            
{
                                
if (control1.PostBackEventHandler != null)
                                
{
                                    
this.RegisterRequiresRaiseEvent(control1.PostBackEventHandler);
                                }

                            }

[EditorBrowsable(EditorBrowsableState.Advanced)]
        
public virtual void RegisterRequiresRaiseEvent(IPostBackEventHandler control)
        
{
            
this._registeredControlThatRequireRaiseEvent = control;
        }

Page会在postDate中寻找实现PostBackEventHandler接口的控件,如果找到就把他赋值给_registeredControlThatRequireRaiseEvent。这样在 RaisePostBackEvent(NameValueCollection postData)中就实现了通过UniqID把客户端事件映射到服务端。
下面看RaisePostBackEvent方法,下面是伪代码:
RaisPostBackEvent()是Page的方法和PostbackEventHandler接口的方法没有关系。
private void RaisePostBackEvent(NameValueCollection postData)
        
{
        
//ProcessPostData已经把实现PostBackEventHandler接口的控件标记为可PostBack了
            if (this._registeredControlThatRequireRaiseEvent != null)
            
{
        
//通过UniqID映射
                this.RaisePostBackEvent(this._registeredControlThatRequireRaiseEvent, null);
            }

            
else
            
{
        
//通过脚步回传映射
                string text1 = postData["__EVENTTARGET"];
                
bool flag1 = !string.IsNullOrEmpty(text1);
                
if (flag1 || (this.AutoPostBackControl != null))
                
{
                    Control control1 
= null;
                    
if (flag1)
                    
{

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/12639172/viewspace-332341/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2008-01-04

  • 博文量
    2376
  • 访问量
    5766305