您的位置:首页 > 编程语言 > ASP

asp.net页面处理流程 - 1

2013-10-30 01:09 309 查看
前两天写了篇文章,今天来验证一下自己的猜想是否正确;顺便把asp.net 页面处理流程详细的说明一下;要把它讲透的话,发现比想象的复杂;看这篇文章的人请先看前面3篇文章;至少知道大致我的例子页面有什么内容;为什么我会写这篇文章,回答了什么问题;

首先,简单介绍一下 IHttpHandle 接口,这个接口有一个主要的方法, void ProcessRequest(HttpContext context); 这个就是用来对页面提交过来的请求进行处理的主方法,

所有的 Page 都实现了这个接口; 甚至连 HttpApplication都实现了这个接口,只不过在实现时直接抛出了异常;

有兴趣的人可以去看看 HttpContext类,这个类里面包含了一个 类型为IHttpHandle 的 Handler的属性,HttpApplication根据Page的url调用 MapHttpHandler方法得到一个  IHttpHandle 接口的实例填充到 context 中,这个接口实例就是aspx页面类的实例对象了;

至于 HttpApplication啥时候调用这个 IHttpHandle接口来对context进行处理,这篇文章暂不分析;我们只分析 aspx页面的处理部分,就是 void ProcessRequest(HttpContext context) 这个方法里面的处理部分;

ProcessRequest  首先进行了一下分析,然后判断结构相应调用 ProcessRequestWithWithAssert 或者ProcessRequestWithNoAssert 方法;两个方法其实实际处理流程一样,唯一区别,ProcessRequestWithWithAssert  会设置两个属性,然后再调用ProcessRequestWithNoAssert 方法),

然后我们继续看 ProcessRequestWithNoAssert ; 

该方法首先设置一下 Page类的 context, request, response, application, cache, 并根据request的Browser属性设置response.ContentType, response.ContentEncoding 属性,然后调用PrecessRequest() 方法;判断事务状态进行相应动作,然后调用 ProcessRequestMain 方法(不容易啊,终于到了主要的处理方法了);

这个方法里面,首先调用了一大堆稀奇古怪的方法,先不管先;

重要的第一个方法是 PerformPreInit ,这儿会首先触发页面的 PreInit 事件; 然后调用, InitializeThemes 方法;然后调用 ApplyMasterPage 方法(分析过后,发现这个方法基本没干啥,就是判断 Master是否存在循环Master,存在的话,抛出异常 );

接下来调用  InitRecursive 方法,这儿会设置设置子控件的Page 属性,调用子控件的 InitRecursive 方法,;然后调用子控件的 OnInit 方法;最后调用 TrackViewState 方法标记 ViewState 跟踪状态;(有兴趣的话,可以看看我前面一篇转的 ViewState详解的文章,里面说明了为啥这儿会标记 ViewState跟踪状态 );

这样的话,页面包含的所有子控件(直接或者间接)都会调用 OnInit方法,并且子控件的OnInit方法将会在父控件之前调用;

在控件的OnInit 方法中,会干几件事情,  

 第1. 触发 控件的 Init事件   

 第2. 将控件的 OnPreLoad 方法加到 Page的 PreLoad事件中,这样,呵呵,Page的OnPreLoad方法会从最后一个最低一层子控件开始一级级把控件的OnPreLoad 方法包含到PreLoad事件中,注意,并不会在此时执行Page的OnPreLoad方法;

第3 判断EnableViewState是否为 true 并且页面 IsPostBack 也为 true,  如果是的话,设置 RequiresDataBinding 属性为 true;

综上所述,根据aspx页面定义的所有子控件均将调用触发自己的Init事件,并且子控件的 Init事件会在父控件之前触发;同时,以同样的顺序,将自身的 OnPreLoad方法加到Page的PreLoad事件中;

注意,到此时为止,还没有根据 PostBack回来的ViewState来重新绑定子控件;我们接着往下看,看看啥地方会干这种事情;

OnInit完成了;

然后,自然是 OnInitComplete 方法,这儿会触发Page的 InitComplete事件;

说明一下,Page有PreInit 事件和InitComplete事件,而控件则没有这样的事件;

然后, 判断是否是Postback, 如果是的话,调用 LoadAllState 方法,这个方法就是根据 PostBack回来的ViewState内容来重新绑定子控件的了;不应该叫绑定,应该说是根据 PostBack回来的ViewState内容产生子控件在前续页面动态绑定的内容;

这个方法很复杂,俺先睡觉先;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  asp.net