再谈ASP.NET第五 – 处理流程
内容页与母版页加载事事件处理的先后顺序
在最终访问结果页时,实际访问的是内容页与母版页。作为有密切关系的两个页面,它们各自要处理自身的初始化与加载等事件。这个过程总体上可以由下图来展示:
加载母版页和内容页共需经过如上8个过程。通过这8个过程可以看出初始化和加载母版页与内容页是一个相互交叠的过程。这8个过程中对应着11个具体的事件。如下:
-
母版页中控件的Init事件;
-
内容页中Content控件的Init事件;
-
母版页Init事件;
-
内容页Init事件;
-
内容页Load事件;
-
母版页Load事件;
-
内容页中Content控件的Load事件;
-
内容页PreRender事件;
-
母版页PreRender事件;
-
母版页控件PreRender事件;
-
内容页中Content控件的PreRender事件;
可以看出内容页和母版页中会引发相同的事件。例如,两者都引发Init、Load和PreRender事件。引发事件的一般规律是,初始化Init事件从最里面的控件(母版页)向最外面的控件(Content控件及内容页)引发,所有其他事件则从最外面的控件向最里面的控件引发。需要明确的是,母版页会合并到内容页中,并被视为内容页中的一个控件。
对于不包含母版页的页面,这个流程如下:
- PreInit
- Init,InitComplete
- PreLoad
- Load,LoadComplete
- PreRender,PreRenderComplete
- SaveStateComplete
- Unload
如图所示:
在页面第一次加载期间,生命周期包括下列步骤:
-
运行构造函数。对于页面或页面上的任何控件,这是生命周期的第一步。
-
确定回传模式。是第一次加载,或者是自回传,还是跨页回传。
-
预初始化。为了在第一个页面初始化之前确定目标设备,这一步是必须的。PreInit是生命周期中第一个事件,该事件使用OnPreInit方法处理事件。
-
加载并初始化个性化主题
-
初始化。在初始化阶段构建控件树。在这个阶段可以为请求初始化任何值。通过处理Init事件的OnInit方法可以实现对初始化阶段的修改。
-
预加载。在回传数据被加载进控件前发生。通过处理PreLoad事件的OnPreLoad方法可以实现对该阶段的修改。
-
加载。在此阶段,用户代码运行,表单控件显示客户端数据。视图状态数据可用,还可以访问页面控件层次结构内的控件。通过处理Load事件的OnLoad方法可以实现对加载阶段的修改。
-
加载完成。完成加载过程。通过处理LoadComplete事件的OnLoadComplete方法可以实现对该阶段的修改。
-
预呈现。这是输出呈现前的一个阶段。通过处理PreRender事件的OnPreRender方法可以实现对该阶段的修改。
-
保存状态。个性化、控件、视图还有页面状态信息都被保存。
-
呈现。在此阶段,页面及其控件输出呈现为HTML。可以使用Render方法进行重写。在Render方法内,如果有必要的话,可以调用CreateChildControls方法实现在控件树内创建并初始化服务器控件。
-
卸载。这是生命周期的最后阶段。这个阶段提供了一个机会,以便完成最终的清除工作,并释放对任何耗费资源的资源,例如,数据库连接。这对于规模是非常重要的。可以通过使用OnUnload方法来处理。
在回传期间,有以下几点与第一次加载不同:
-
加载状态。初始化完成后,加载页面和控件状态,同时,从页面上的一个隐藏变量加载视图状态。
-
处理回传数据。在这个阶段,通过Post方法来处理发送到服务器的数据。通过LoadPostData方法可实现对于需要回传的视图状态的任何更新。
-
预加载和加载。这和第一次加载相同。
-
发送回传变化通知。如果当前状态较先前状态发生了任何变化,就会通过RaiseChangedEvents方法引发变化事件。引发的顺序和控件在控件树种的顺序相同。
-
处理回传事件。确切的说是用户行为导致了回传。在所有变化事件得以处理后,将处理用户行为。导致回传的最初客户端事件在RaisePostBackEvent方法中进行处理。
-
加载完成。从这里开始,都和第一次加载相同。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异