宝哥软件园

ASP.NET页面生命周期详解

编辑:宝哥软件园 来源:互联网 时间:2021-09-19

当ASP.NET运行时,页面将经历一个生命周期,在这个生命周期中,将执行一系列处理步骤。包括初始化、实例化控件、恢复和维护状态、在运行时处理程序代码以及呈现。熟悉页面生命周期非常重要,这样我们就可以在生命周期的适当阶段编写代码。如果我们能在编写代码时考虑一下我们现在正在生命周期中的哪一步,那将是非常好的。

几个有代表性的问题。

首先,让我们思考几个问题,看看当我们完成对页面生命周期的描述时,我们是否能回答它们。

1.为什么this.textbox1.Text可以获取服务器端用户提交的数据?2.在页面加载、响应中。Write('hello ')查看生成的html代码原始文件。你好在哪里?为什么呢?3.服务器端有一个按钮,设置了点击事件。点击事件什么时候执行?先执行Page_Load事件还是先执行click事件?4.为什么客户端可以在服务器端通过this.textbox1.Text设置后显示该值?了解ASP。NET的请求管道、应用程序生命周期和整体运行机制,童鞋可能知道ASP中PreRequestHandlerExecute事件和PostRequestHandlerExecute事件之间的页面生命周期。NET的应用程序生命周期是为aspx页面构建一系列页面控制树。触发各种页面时间,对于通用处理程序ashx,是直接执行我们开发人员编写的ProcessRequest方法,对于MVC应用,是创建控制器工厂,创建控制器对象,调用Action。

以下主要是关于ASP.NET网页表单中页面的生命周期。

用反编译工具查看Page类的ProcessRequest方法,可以看到首先调用的是FrameworkInitialize在FrameworkInitialize中,创建页面控件树,然后调用ProcessRequestMain,启动整个页面生命周期(实际上是调用一系列事件方法)(有些图片可能看不到右边,但是图片可以在新的选项卡中打开)。

1.创建页面控件树。

FrameworkInitialize在内部调用了_buildControlTree()方法。

在上图中,左侧是前台页面的代码,右侧是对应生成的构建控件树的代码。中间截取的是生成表单部分的代码。

看下面的示意图。

浏览器DOM树是根据Html标签生成的C语言DOM树,而ASP.NET服务器是C#创建的控制树,也是根据DOM结构创建的。本质是一样的。服务器端所有内容都被添加到页面对象的控件集合中。当标签在服务器端有对应的控制对象时,使用控制对象,没有时,使用literarchy进行封装。服务器控件或字符串标签(没有runat='server '的标签)作为控件对象存在于前台页类的控件集合中。优点是在生成前台页面的html代码时,只需要遍历控件集合中每个控件对象的RenderControl方法,每个控件都会调用自己的Render方法来生成对应的Html字符串。然后,所有控件生成的html字符串都被还原为页面的html代码。

2.触发PerformPreInit事件。

该事件在所有初始化之前被初始化。此事件主要初始化主题和母版页。

private void PerformPreInit(){ this。OnPreInit(EventArgs。空的);这个。InitializeThemes();这个。ApplyMasterPage();这个。_ preInitWorkComplete=true}3.触发InitRecursive事件。

4.触发LoadAllState()事件。

加载页面状态解析ViewState,对页面表单中的ViewState进行de-Base64编码反序列化,存储在页面的ViewState属性中。

5.触发postdata进程(这。_ requestvaluecollection,true)事件。

private void ProcessPostData(NameValueCollection Postdata,bool fBeforeLoad){ if (this。_ changedpostdata consumers==null){ this。_ changedpostdata consumers=new ArrayList();} if (postD

更多资讯
游戏推荐
更多+