• 博客园logo
  • 会员
  • 周边
  • 新闻
  • 博问
  • 闪存
  • 众包
  • 赞助商
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
学无止境
博客园    首页    新随笔    联系   管理    订阅  订阅
ASP.NET页面生命周期

1.启动
    在启动阶段,将设置页属性,如 Request 和 Response。
    在此阶段,页还将确定请求是回发请求还是新请求,并设置 IsPostBack(是否响应回发而加载) 属性。
    页还设置 UICulture(设置与页关联的 Thread 对象的用户界面 (UI) ID) 属性。
2.初始化
    1)预初始化
        PreInit(页面事件)
        页面调用OnPreInit方法引发PreInit事件
        使用该事件来执行下列操作:
        ·检查 IsPostBack 属性来确定是不是第一次处理该页。此时还设置了 IsCallback(是否回调) 和 IsCrossPagePostBack(跨页回发中是否涉及该页) 属性。
        ·创建或重新创建动态控件。
        ·动态设置主控页。
        ·动态设置 Theme 属性。
        ·读取或设置配置文件属性值。
        说明:如果请求是回发请求,则控件的值尚未从视图状态还原。如果在此阶段设置控件属性,则其值可能会在下一事件中被覆盖。
    2)初始化
        Init(控件事件&&页面事件)
        1.递归调用子控件的OnInit方法来引发它们的Init事件
            递归初始化Control集合中的控件。初始化包括设置这些控件的属性
        2.页面调用OnInit方法引发Init事件
    3)开启对视图状态更改的跟踪
        TrackViewState(页面方法&&控件方法)
        页面调用TrackViewState方法来启动页面的视图状态跟踪,接着递归调用子控件的TrackViewState方法来启动它们的视图状态跟踪。
        视图状态跟踪使控件可以保留所有以编程方式添加到 ViewState 集合的值。在开启视图状态跟踪之前,所有添加到视图状态的值都会在回发期间丢失。
    4)初始化阶段结束
        InitComplete(页面事件)
        页面调用OnInitComplete方法来引发InitComplete事件
3.加载
    1)加载控件状态(仅回发)
        LoadControlState(控件方法)
        页面递归调用Controls集合中控件的LoadControlState方法,
        这些控件已经调用了Page类的RegisterRequiresControlState方法,以使用它们的控件状态。
    2)加载视图状态(仅回发)
        LoadViewState(页面方法&&控件方法)
        1.页面调用自身的LoadViewState方法
        2.递归调用Controls集合控件的LoadViewState方法,以允许它们加载它们的已经保存的视图状态。
    3)处理回发数据(仅回发)
        页面调用实现IPostBackDataHandler接口的控件的LoadPostData方法,并将回传数据传递给该方法。
        每个控件的LoadPostDate方法都必须访问回传数据,并据此更新相应的控件属性。
        例如:TextBox控件的LoadPostData方法将文本框的新值设置为TextBox控件的Text属性值。

        HTTP请求中包装的所有用户数据,即用<form>标签定义的所有输入字段的内容,都在这时进行处理。

        投递的数据通常采取如下格式:TextBox1=text&DropDownList1=selectedItem&Button1=Submit
        这是一串用&隔开的名称/值对。这些值装入一个内部使用的集合。
        页面处理器视图将投递的数据集合中的名称与页面中的控件的ID进行匹配。
        每找到一个匹配,处理器检查该服务器控件有没有实现 IPostBackDataHanlder接口。
        如果实现了,则调用该接口的LoadPostData方法,该控件有机会根据投递的数据刷新它的状态。
        具体说,如果LoadPostData()方法返回true,即状态已被更新,则把该控件添加到一个不同的集合中,以便以后引起关注。

        如果一个发送的名称与任何一个服务器控件都不匹配,则留下它并临时放在一个不同的集合中,稍后再试。
    4)预加载
        PreLoad(页面事件)
        页面调用OnPreLoad方法以引发PreLoad事件。该事件表示页面生命周期将进入加载阶段。
    5)加载
        Load(页面事件&&控件事件)
        1.页面调用自身的OnLoad方法以引发自身的Load事件
        2.页面递归调用Controls集合中控件的OnLoad方法以引发它们的Load事件。

        页面中的控件在此时创建,并且他们的状态完全反映前一个状态以及从客户端发送的任何数据。
        页面开发人员可以为Load事件注册回调,那么就可以通过编程将子控件添加到页面的Controls集合中。
        页面准备执行所有与页面逻辑和行为有关的初始化代码。
        这时,访问控件属性和视图状态是绝对安全的。
    6)处理动态创建的控件
        如果在显示前,页面中的所有控件都有机会完成初始化,页面处理器将再次尝试匹配那些尚未与现有控件匹配的投递值。
        这主要是应对动态的创建的控件设想把一个控件动态地添加到页面树上,例如为了响应某个用户动作。
        每次回发以后重新创建页面,因此与动态创建的控件有关的任何信息会丢失。
        另一方面,提交页面的窗体时,其中的动态控件定期发送的合法而有效地信息填充。
        根据设计,第一次投递的数据时,不可能有什么服务器控件匹配动态控件ID。
        然而,ASP.NET Fromework知道Load事件会创建某些控件。因此有了再次匹配这一说。
        如果动态控件已经在Load事件中被重建了,现在就可以找到一种匹配,并且该控件可以用投递的数据刷新状态。
4.回发事件处理
    1)检测控件状态变化(仅回发)
        整个ASP.NET工作机制围绕一个隐含的假设:
        在浏览器中操作一些HTML输入标签与服务器控件具有一一对应关系。
        例:<input type=”text”>与<asp:TextBox>。
        当用户把一些信息输入到元素中后,调用对应的TextBox 控件来处理该投递值。
        对于让LoadPostData方法返回true的所有控件,现在要执行RaisePostDataChangeEvent方法,该方法也属于IPostBackDataHandler接口。
        该方法通知ASP.NET应用程序控件的状态已经发生变化。
    2)验证控件(仅回发和包含验证程序控件)
        Validate(页面方法)
        页面调用自身的Validate方法检查各个验证控件的 IsValid 属性。
    3)执行服务器端回发事件(仅回发)
        RaisePostBackEvent(页面方法)
        检查各个验证控件的 IsValid 属性为true时页面调用RaisePostBackEvent方法。
        执行触发服务器端的事件代码
        譬如一个按钮的Button1_Click事件
        点击按钮就触发服务器端的Button1_Click事件
5.呈现
    1)完成加载
        LoadComplete(页面事件)
        页面调用OnLoadComplete方法来引发LoadComplete事件。
        这表示所有加载活动,包括加载回传数据,以及引发回传数据修改事件,并以更新控件自身的活动都完成了。
    2)引发回调事件(仅回发和客户端回调)
        页面调用控件的RaiseCallBackEvent方法。
        该控件可使用AspNet客户端回调机制来允许客户端方法(例如JavaScript函数)调用服务器端方法,而无需将整个页面回传给服务器。
        RaiseCallBackEvent方法必须调用服务器端方法。如果页面的回传使用了客户端回调机制,那么页面将不会执行剩余的页面生命周期阶段。
    3)预呈现
        PreRender(页面事件)
        1.调用EnsureChildControls方法来确保在页面进入呈现阶段之前,创建其子控件。
        2.调用自身的OnPreRender方法来引发PreRender事件。
        3.递归调用Controls集合中控件的OnPreRender方法,以引发它们的PreRender事件。
    4)数据绑定
        DataBinding(控件事件)
        调用设置了 DataSourceID 属性的每个数据绑定控件的 DataBind 方法之后引发DataBinding事件。
        这将应用于以声明方式设置其属性的 DataSourceID 控件。否则,该事件在您调用控件的 DataBind 方法时发生。
        该事件标记将控件绑定到数据的进程的开始。使用此事件可以手动打开数据库连接,如果需要,还可以在运行查询之前动态设置参数值。
    5)预呈现完成
        PreRenderComplete(页面事件)
        页面调用OnPrerenderComplete方法来引发PreRenderComplete事件
        因为PreRender事件是递归地为所有子控件激发的,所以编程者无法知道何时完成预呈现阶段。而该事件的激发代表上面的事件结束了。
    6)保存控件状态
        SaveControlState(控件方法)
        页面递归调用Controls集合中控件的SaveControlState方法。这些控件已经调用了Page类的RegisterRequiresControlState方法来保存它们的控件状态。
    7)保存视图状态
        SaveViewState(页面方法&&控件方法)
        1.页面调用自身的SaveViewState方法
        2.调用Controls集合中的SaveViewState方法,以允许它们来保存其视图状态。
    8)保存状态完成
        SaveStateComplete(页面事件)
        页面调用OnSaveStateComplete方法以引发SaveStateComplete事件,这表示所有状态保存活动都完成了。
    9)呈现
        RenderControl(控件方法)
        1.创建一个HtmlTextWriter类实例,该实例封装了输出响应流
        2.调用RenderControl方法,并将HtmlTextWriter实例传递给该方法。
        3.递归调用子控件的RenderControl方法,以便允许每个控件能够呈现其Html标记文本。
          子控件的Html标记文本组成了最终发送给客户端浏览器的Html标记文本。
        这里可以继续了解一下RenderControl Render RenderChildren之间的关系
        http://hi.baidu.com/ppt2052/blog/item/49ad84194de6e079d8b4bd64.html
6.卸载
    1)卸载
        Unload(控件事件&&页面事件)
        1.递归调用Controls集合中控件的OnUnload方法,以引发它们的Unload事件。
            在控件中,使用该事件对特定控件执行最后清理,如关闭控件特定数据库连接。
        2.调用自身的OnUnload方法引发Unload事件。
            对于页自身,使用该事件来执行最后清理工作,如:关闭打开的文件和数据库连接,或完成日志记录或其他请求特定任务。
        说明:在卸载阶段,页及其控件已被呈现,因此无法对响应流做进一步更改。如果尝试调用方法(如 Response.Write 方法),则该页将引发异常。
    2)释放资源
        Dispose(页面方法&&控件方法)
        调用此方法用于释放全部占有的资源

 

此文根据以下出处进行整理而成
http://www.cnblogs.com/c2303191/articles/1110405.html
http://www.cnblogs.com/30erli/archive/2010/09/19/1830713.html
http://msdn.microsoft.com/zh-cn/library/ms178472.aspx

 

posted on 2010-10-14 02:16  studyendless  阅读(291)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2026
浙公网安备 33010602011771号 浙ICP备2021040463号-3