Page类作用:
Page类,完整写法是System.Web.UI.Page。Default.aspx.cs文件中定义了一个名为"_Default"的类,此类是从Page类继承的,可以将aspx页面也看成一个类,这个类是从"_Default"类继承的,因此aspx页面实际上是从Page类继承的。继承关系:Page类←_Default←Default.aspx。所以在_Defaul类中编写的程序就可以作用于Default.aspx页面。
页面运行模型:
当一个aspx页面被浏览器进行访问时,ASP.NET首先会在高速缓存中查找与这个aspx文件相关的一起编译过的页面类。当查找失败时,ASP.NET讲读取和解析文件,并创建一颗解析树(Parse Tree)。解析树类似于控件树,但并不包含控件,解析树包含称为控件生成器(Control Builder)的对象实例。控件生成器包含在解析过程期间手机的相关控件信息,通过@Page指令中Language属性所指定的语言把解析树转变为代码,然后ASP.NET调用相应的编译程序,动态地编译与aspx页面相关的Page继承类,并放置在缓存中。最后创建这个类的一个新实例,执行实例化页面的程序,处理生成的控件树,每个控件都生成了相应的HTML输出,并发送至浏览器。
总体来看,Page类很像一个调度者,完成响应IIS的HTTP请求,并初始化一些内部对象;初始化页面上的各种控件,恢复ViewState状态,载入页面,生成页面HTML代码等流水线式的工作。
Page类的生命周期中程序的执行顺序
当浏览器给ASP.NET页面发送请求时,首先响应的就是与aspx页面相关联的Page类对象,Page类在其生命周期内执行的方法按先后顺序的解释如下:
(1)OnPreInit方法(触发PreInit事件),在页面初始化之前发生。ASP.NET在此方法时创建了页面声明定义的控件树,在执行此方法之后,Page类对象又会自动调用控件树中所有控件的OnInit方法,并将控件初始化。所以执行此方法后,程序已经能够访问置于页面的各种控件了,控件的属性被置为aspx源中所定义的初始值。(需要注意)
(2)OnInit方法(触发Init事件),在页面初始化时发生。执行此方法后,页面会跟踪ViewState的值。
(3)OnInitComplete方法(触发InitComplete事件),页面初始化完成时发生。如果IsPostBack为True,这个方法执行后,页面还会完成两项非常重要的工作:a.将触发PostBack控件及其触发的相关参数进行解析,称之为把回传事件映射到服务器端事件,实现IPostBackEventHandler接口;b.将解析出来的ViewState的值赋给相应控件的相应属性。称之为加载回传数据,实现IPostBackDataHandler接口。
(4)OnPreLoad方法(触发PreLoad事件)页面加载入之前发生。
(5)OnLoad方法(触发Load事件),此方法开始时,控件树中的所有控件都已被初始化,并恢复到他们在前一个周期的最后状态(加载回传数据),这时哟哦恶魔能够安全访问页面中的其他控件了,所以系统提供一个Page_Load方法,以便在此事件触发时运行用户自定义的一些程序。
(6)OnLoadComplete方法(触发LoadComplete事件)
(7)OnPreRender方法(触发PreRender事件)和OnPreRenderComplete方法(出发PreRenderComplete事件),在页面和控件的HTML代码生成之前所先后执行的方法。
(8)OnSaveStateComplete方法(触发SaveStateComplete事件)保存页面控件的ViewState值。
(9)Render方法,没有触发事件,生成页面和控件的HTML代码。
(10)OnUnload方法(触发Unload事件)。Page类运行结束时,将释放内存,整个生命周期结束。
由此可以看出一个aspx页面就像一个Windows的应用程序,从载入内存开始,顺序执行一序列的程序,生成一个结果HTML,再退出内存。只是这个程序的执行不是由双击鼠标或是运行命令触动的,而是由IIS根据HTTP请求来触动的。