asp.net 页面的事件执行顺序

xiaoxiao2026-08-27  0

默认的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

 

即:先加载继承页的,在加载自己的,如果继承页有继承则先加载继承页的继承。

转载请注明原文地址: https://www.6miu.com/read-5051941.html

最新回复(0)