简化: ASP.NET 事件触发顺序
using System.Data; using System.Configuration; using System.Web; using System.Web.Security; using System.Web.UI; using System.Web.UI.WebControls; using System.Web.UI.WebControls.WebParts; using System.Web.UI.HtmlControls; public partial class _Default : Page { #region OnPreInit 第一步: 视图未被还原(设置控件属性无效), 此处主要设置Theme(主题) ,读写配置文件属性 protected override void OnPreInit(EventArgs e) { } #endregion #region OnInit 第二步: 在所有控件都已初始化且已应用所有外观设置后引发。使用该事件来读取或初始化控件属性。 protected override void OnInit(EventArgs e) { } #endregion #region OnInitComplete 第三步: 由 Page 对象引发。使用该事件来处理要求先完成所有初始化工作的任务。 protected override void OnInitComplete(EventArgs e) { } #endregion #region PreLoad 第四步: html服务器控件的值在次恢复(值已经恢复),然后会处理 Request 实例包括的任何回发数据。 protected override void OnPreLoad(EventArgs e) { } #endregion #region OnLoad 第五步: 以递归方式对每个子控件执行相同操作,设置控件中的属性并建立数据库连接。 protected override void OnLoad(EventArgs e) { } #endregion #region 第六步: 执行完之后,再执行用户控件的Page_Load()事件 protected void Page_Load(object sender, EventArgs e) { } #endregion #region 控件事件 第七步: 控件事件,如 Button 控件的 Click 事件或 TextBox 控件的 TextChanged 事件。 protected void Button1_Click(object sender, EventArgs e) { } #endregion #region OnLoadComplete 第八步: 对需要加载页上的所有其他控件的任务使用该事件。 protected override void OnLoadComplete(EventArgs e) { } #endregion #region OnPreRender 第九步: 设置了 DataSourceID 属性的每个数据绑定控件会调用 DataBind 方法, 使用该事件对页或其控件的内容进行最后更改 protected override void OnPreRender(EventArgs e) { } #endregion #region SaveStateComplete 第十步: 将忽略此时对页或控件进行的任何更改。 protected override void OnSaveStateComplete(EventArgs e) { } #endregion #region Render 第十一步 //Render //这不是事件;在处理的这个阶段,Page 对象会在每个控件上调用此方法。 //所有 ASP.NET Web 服务器控件都有一个用于写出发送给浏览器的控件标记的 Render 方法。 //如果创建自定义控件,通常要重写此方法以输出控件的标记。 //不过,如果自定义控件只合并标准的 ASP.NET Web 服务器控件,不合并自定义标记,则不需要重写 Render 方法。 //有关更多信息,请参见开发自定义 ASP.NET 服务器控件。 //用户控件(.ascx 文件)自动合并呈现,因此不需要在代码中显式呈现该控件。 #endregion #region OnUnload 第十二步: 该事件首先针对每个控件发生,继而针对该页发生。在控件中,使用该事件对特定控件执行最后清理, protected override void OnUnload(EventArgs e) { } #endregion }
母版页和内容页都可以包含控件的事件处理程序。 对于控件而言,事件是在本地处理的,即内容页中的控件在内容页中引发事件,母版页中的控件在母版页中引发事件。 控件事件不会从内容页发送到母版页。 同样,也不能在内容页中处理来自母版页控件的事件。
在某些情况下,内容页和母版页中会引发相同的事件。 例如,两者都引发 Init 和 Load 事件。 引发事件的一般规则是初始化事件从最里面的控件向最外面的控件引发,所有其他事件则从最外面的控件向最里面的控件引发。 请记住,母版页会合并到内容页中并被视为内容页中的一个控件,这一点十分有用。
下面是母版页与内容页合并后事件的发生顺序:
-
内容页 PreInit 事件。
-
母版页控件 Init 事件。
-
内容控件 Init 事件。
-
母版页 Init 事件。
-
内容页 Init 事件。
-
内容页 Load 事件。
-
母版页 Load 事件。
-
母版页控件 Load 事件。
-
内容页控件 Load 事件。
-
内容页 PreRender 事件。
-
母版页 PreRender 事件。
-
母版页控件 PreRender 事件。
-
内容页控件 PreRender 事件。
-
母版页控件 Unload 事件。
-
内容页控件 Unload 事件。
-
母版页 Unload 事件。
-
内容页 Unload 事件。
母版页和内容页中的事件顺序对于页面开发人员并不重要。 但是,如果您创建的事件处理程序取决于某些事件的可用性,那么您将发现,了解母版页和内容页中的事件顺序很有帮助。