Asp.Net 页面生命周期
我们知道在Asp.Net19个管道处理事件中,在PostResolveRequestCache事件之后会创建IHttpHandler接口的处理类。而在PostAcquireRequestState事件之后就会执行页面的生命周期。那么他是怎么实现的呢?
打开Reflector反编译工具,我们可以看到我们的页面实现了IHttpHandler接口。
最重要的是ProcessRequest方法,
然后找到ProcessRequestWithNoAssert方法,继续找到ProcessRequest方法。之后有一个很重要的方法ProcessRequestMain。在这个方法里面就开始页面生命周期的执行。
首先我们看到的是DeterminePostBackMode方法。这个方法决定IsPostBack的值。然后调用PerformPreInit。在这个方法里面调用OnPreInit准备初始化Page,加载主题,应用模板页。
然后是InitRecursive方法,这个方法里面递归调用子控件的InitRecursive方法,执行OnInit,,追踪ViewSate:TrackViewState(由于控件的OnInit先被执行,要想设置子控件的值不被序列化到ViewState中,则可以PreInit中设置数据)。
接下来调用OnInitComplete方法。然后调用 LoadAllState(在回传的时候调用),
在这个方法中调用进行ViewSate反序列化以获得ViewState,
然后调用LoadControlStateInternal加载子控件的控件状态,然后加载子控件的视图状态,即把ViewState的值应用到控件中来。之后调用ProcessPostData方法(只在回传时调用)将提交到表单的值加载到控件中。接下来调用OnPreLoad,然后调用LoadRecursive,在这个方法里调用OnLoad方法,
然后递归调用子控件的LoadRecursive。
然后再次调用ProcessPostData(在回传的时候调用),接着调用RaiseChangedEvents。然后是RaisePostBackEvent该方法引发实现IPostBackEventHandler接口控件的注册事件。接下来是OnLoadComplete,PreRenderRecursiveInternal方法里的OnPreRender方法是改变页面和控件的最后一次机会,然后递归调用子控件的PreRenderRecursiveInternal方法。
然后是PerformPreRenderComplete方法,递归调用子控件的方法PerformPreRenderComplete,接下来是 SaveAllState,在里面调用用来保存ViewState
然后是OnSaveStateComplete,
RenderControl页面呈现,最后是UnloadRecursive,结束。