默认的aspx页面都是继承自System.Web.UI.Page,Page基类定义了很多需要预执行的事件,这些事件虽没有在aspx页面中显示的定义或提及,但它们仍然会以一定的顺序去执行,这些事件的执行顺序是:
1. OnPreInit 2. OnInit 3. OnInitComplete 4. OnPreLoad 5. Page_Load 6. OnLoad 7. OnLoadComplete 8. OnPreRender
以上事件除了Page_Load 为aspx页面自己的事件外,其余的都是继承自基类Page。
当页面进行回发时,如点击按钮,以上事件都会重新执行一次,这时的执行顺序为:
1. OnPreInit 2. OnInit 3. OnInitComplete 4. OnPreLoad 5. Page_Load 6. OnLoad
7. Button_Click8. OnLoadComplete 9. OnPreRender
可以看到,Button_Click事件位于OnLoad之后执行,可以测试一下:
public partial class TestControls : System.Web.UI.Page { static int count = 0; protected void Page_Load(object sender, EventArgs e) { Response.Write(count+ "Page_Load <br />"); count++; } protected override void OnPreInit(EventArgs e) { base.OnPreInit(e); Response.Write(count + "OnPreInit <br />"); count++; } protected override void OnInit(EventArgs e) { base.OnInit(e); Response.Write(count + "OnInit <br />"); count++; } protected override void OnLoad(EventArgs e) { base.OnLoad(e); Response.Write(count + "OnLoad <br />"); count++; } protected override void OnPreLoad(EventArgs e) { base.OnPreLoad(e); Response.Write(count + "OnPreLoad <br />"); count++; } protected override void OnLoadComplete(EventArgs e) { base.OnLoadComplete(e); Response.Write(count + "OnLoadComplete <br />"); count++; } protected override void OnInitComplete(EventArgs e) { base.OnInitComplete(e); Response.Write(count + "OnInitComplete <br />"); count++; } protected override void OnUnload(EventArgs e) { base.OnUnload(e); } protected override void OnDataBinding(EventArgs e) { base.OnDataBinding(e); Response.Write(count + "OnDataBinding <br />"); count++; } protected override void OnPreRender(EventArgs e) { base.OnPreRender(e); Response.Write(count + "OnPreRender <br />"); count++; }
protected void btnGraphics_Click(object sender, EventArgs e) { //Bitmap bmp = new Bitmap(10, 10); //Graphics g = Graphics.FromImage(bmp); Response.Write(count + "btnGraphics_Click <br />"); count++; } }如果页面从另一个页面继承,如BasePage:System.Web.UI.Page,在BasePage中做了一些扩展,如权限检查,而其他页面从BasePage继承,则BasePage和最终Page的事件激活顺序是:
UI.PreInitPage.PreInitUI.InitPage.InitUI.InitComplitePage.InitCompliteUI.PreLoadPage.PreLoadUI.LoadPage.LoadUI.LoadCompletePage.LoadCompleteUI.PreRenderPage.PreRenderUI.PreRenderCompletePage.PreRenderComplete
如果使用了MasterPage,则MasterPage中的事件和ContentPage中的事件按照下面顺序激活:
ContentPage.PreInitMaster.InitContentPage.InitContentPage.InitCompliteContentPage.PreLoadContentPage.LoadMaster.LoadContentPage.LoadCompleteContentPage.PreRenderMaster.PreRenderContentPage.PreRenderComplete
更进一步,如果ContentPage继承BasePage,那么,各事件的执行顺序将变成:
UI.PreInitContentPage.PreInitMaster.InitUI.InitContentPage.InitUI.InitCompliteContentPage.InitCompliteUI.PreLoadContentPage.PreLoadUI.LoadContentPage.LoadMaster.LoadUI.LoadCompleteContentPage.LoadCompleteUI.PreRenderContentPage.PreRenderMaster.PreRenderUI.PreRenderCompleteContentPage.PreRenderComplete
即:先加载继承页的,在加载自己的,如果继承页有继承则先加载继承页的继承。
