ASP.NET学习笔记——webform页面生命周期

webform运行原理

运行原理相同点:aspx和ashx运行机制差不多。

运行原理不同点:

1.执行事件管道的时候,在7,8个事件之间创建的是前台页面类对象,那后台类是什么时候创建的呢?由于aspx前台页面继承自后台,所以创建前台页面类时,后台就创建好了。

2.在第11、12事件之间,调用存放在remapHandler中的前台页面类对象的processRequest方法,会进行复杂的处理,也就是走页面生命周期。

webform页面生命周期

1.通过反编译,查看前台类代码

前台代码P01Index.aspx

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="P01Index.aspx.cs" Inherits="webSite.P01Index" %>
<<%@ Import Namespace="webSite" %>
<!DOCTYPE html>

<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title></title>
    <script runat="server">
        public string GetValue(string inputstr)
        {
            return "你输入了:" + inputstr +" 已经被前台页面类同名方法覆盖 ";
        }
    </script>
</head>
<body>
    <form id="form1" runat="server">
        <div>
            查看当前前台页面被编译后的页面类所在的程序集:<%= this.GetType().Assembly.Location %><br />
            Name= <%=Name %><br />
            Age=<%= Age %>
            <br />
            调用非私有方法:<%= GetValue("八戒") %><br />

            Name= <% Response.Write(Name); %>
            <%
                if (Age > 30)
                {
                    Response.Write("超过30了");
                }
                else
                {
                    Response.Write("你还可以玩几年");
                }

                string res = kits.GetInput("哈哈");
                Response.Write("<br />"+res);
            %>
        </div>
        <asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
        <asp:Button ID="Button1" runat="server" Text="Button" />
    </form>
</body>
</html>

1.1 如何查看当前前台页面被编译后的页面类所在的程序集? this.GetType().Assembly.Location

2 前台页面中写的代码被编译到_Renderfrom1方法中

3 页面中的方法会编译成前台页面类中的方法

4.调用前台页面类对象的ProcessRequest方法,此方法会调用父类的ProcessRequest方法,在父类方法中,调用this.FrameworkInitialize();

4.1 FrameworkInitialize() 在页生成过程中根据页的声明性特性初始化控件树

4.2 创建控件树,_BuildControlTree()内部就是将整个页面控件树的结构创建好,如果是普通的C#代码,则被编译到一个方法体里

4.3 在父类方法中紧接着调用ProcessRequestMain方法,在此方法中,主要是触发一系列的事件

4.4 通过ViewState,决定是否是IsPostBack,即确定当前请求是否是回发,如果ViewState不为null,那么IsPostBack则为true

4.5 ProcessRequestMain方法

4.6 在ProcessRequestMain方法中,调用了this.PerformPreInit();

  (1)触发PreInit事件

  (2)将加载个性化信息和页主题(如果有),初始化母版页。

4.7 在ProcessRequestMain方法中,调用了this.InitRecursive(null);

  (1) 调用基类的InitRecursive方法通过递归对子控件进行初始化, 比如: 生成控件ID,设置控件的Page属性。
  (2) Init事件将会在此时被触发

4.8  this.OnInitComplete(EventArgs.Empty); InitComplete事件被被触发

4.9 this.LoadAllState();加载页面状态解析ViewState,将页面表单中的ViewState进行反Base64编码,反序列化,存在页面的ViewState属性中

4.10 this.ProcessPostData(this._requestValueCollection, true);将表单里提交过来的控件数据设置给页面对象的控件树中对应控件的属性

4.11 this.OnPreLoad(EventArgs.Empty); preLoad事件被调用

4.12 LoadRecursive()被调用,页面的Load事件先被触发,紧接着控件的Load事件被触发,Page_Load方法就是响应Load事件的方法,因此此时Page_Load方法会被执行

4.13 this.ProcessPostData(this._leftoverPostData, false); 为在Page_Load中添加的新控件赋值(值来自表单提交)

4.14 this.RaiseChangedEvents();执行控件非点击回传事件,例如页面中的DropDownlist

 

4.15 this.RaisePostBackEvent(this._requestValueCollection);执行控件点击回传事件,例如Button

4.16 this.OnLoadComplete(EventArgs.Empty);触发LoadComplete事件

4.17 this.PreRenderRecursiveInternal();PreRender事件被触发

4.18 this.PerformPreRenderComplete();PreRenderComplete事件被触发

4.19 this.SaveAllState();将控件的属性状态存入页面的ViewState中

4.20 this.RenderControl(this.CreateHtmlTextWriter(this.Response.Output));;递归调用控件树里的每个控件的Render来生成整个页面的html代码

最后,上一张完整的大图

参考资料

1.传智播客

2.http://www.knowsky.com/897396.html

3.http://www.3fwork.com/b101/000785MYM001797/

时间: 03-01

ASP.NET学习笔记——webform页面生命周期的相关文章

【译】ASP.NET应用程序和页面生命周期

为何翻译此文 一.此文是Code Project社区2010年4月ASP.NET板块的最佳文章,说明了此文的份量: 二.锻炼自己的英文技术文章翻译能力,提高英文技术文档阅读能力: 三.了解掌握ASP.NET页面生命周期是非常必要的,这有助于我们更加灵活的控制页面,以我们需要的方式编程开发: 关于原文作者 原文作者:Shivprasad koirala 原文地址:http://www.codeproject.com/Articles/73728/ASP-NET-Application-and-Pa

Asp.Net请求原理and页面生命周期

前天去面试,让我说下生命周期,本来之前就了解过,但是没说出来,被深深的鄙视了;今天弄了一上午,现在发到这分享一下,有什么错误请各位大牛们指出~~ 昨天面试,又遇到这问题了...  然后说了半天,人家问我一用户控件的周期在哪执行,我想了半天,也没有想出来,回来只好再研究了.. 请求的本页面Page-Load->用户自定义控件Page-Load->本页面渲染之前Page-PreRender    这样一个顺序 页面发送请求原理 浏览器将请求封装成Http请求报文发送到服务器; 服务器端HTTP.S

ASP.NET应用程序与页面生命周期

在本文中,我们将了解不同的事件,ASP.NET 应用程序的生命周期以浏览器向 Web 服务器(对于 ASP.NET 应用程序,通常为 IIS)发送请求为起点,直至将请求结果返回至浏览器结束.在这个过程中,首先我们需要了解ASP.NET请求的2个大致的步骤.其次我们将详细了解 'httphandler ',' httpmodule和 asp.net 页面对象(Page)中不同的事件的执行顺序,逻辑. 二个步骤的过程:asp.net请求处理,2步的过程如下所示,用户发送一个请求到IIS 服务器: 1

ASP.NET最常用的页面生命周期事件

PreInit:在页生命周期的早期阶段可以访问的事件.在PreInit事件后,将加载个性化信息和页主题. Init:在所有的控件都已初始化,且已应用所有外观设置后引发.使用该事件来读取或初始化控件属性. InitComplete:在页初始化完成时发生. PreLoad:在Load事件之前对页面或控件执行处理.在Page引发该事件后,它会为自身和所有控件加载视图状态,然后处理Request实例包括对任何回发数据. Load:当服务器控件加载到Page对象时发生.使用IsPostBack页面属性检查

《Servlet学习笔记》Servlet生命周期和调用

    学习技术有时会感觉很枯燥,有时感觉很绕,N多调用,不好理解,但如果能画出图来,就可以一目了然. 图比文字更容易让人接受,并产生深刻印象.一张图可以包含很多东西. 下面一些图来自于网络,偶然间发现,感觉让人忽然明白并回忆起了好多. Servlet程序是由WEB服务器调用,web服务器收到客户端的Servlet访问请求后: Web服务器首先检查是否已经装载并创建了该Servlet的实例对象.如果是,则直接执行第四步,否则,执行第二步: 装载并创建该Servlet的一个实例对象: 调用Serv

Maven学习笔记(六):生命周期与插件

何为生命周期: Maven的生命周期就是为了对所有的构建过程进行抽象和统一.Maven从大量项目和构建工具中学习和反思,然后总结了一套高度完善的.易扩展的生命周期.这个生命周期包含了项目的清理.初始化.编译.测试.打包.集成测试.验证.部署和站点生成等几乎所有构建步骤.也就是说,几乎所有项目的构建,都能映射到这样一个生命周期上. Maven的生命周期是抽象的,这意味着生命周期本身不做任何实际的工作,在Maven的设计中,实际的任务(如编译源代码)都交由插件来完成.这种思想与设计模式中的模板方法(

android学习笔记(5)Activity生命周期学习

对应若水老师视频教程第8课 一定要看这个视频 每个activity都有它的生命周期,开启它,关闭它,跳转到其它activity等等,都会自动调用以下某种方法.对这些个方法覆写后观察学习. protected void onCreate(Bundle savedInstanceState); protected void onStart(); protected void onRestart(); protected void onResume(); protected void onPause(

传播智客学习笔记--L27 Activity生命周期

将Activity设置为对话框样式 生命周期示意图

react学习笔记之组件生命周期

React 中的组件有三种状态: Mounted:已插入真实 DOM Updating:正在被重新渲染 Unmounted:已移出真实 DOM 它为每个状态都提供了两种处理函数: will:函数在进入状态之前调用, did: 函数在进入状态之后调用,三种状态共计五种处理函数. 所以,除了组件初始化时调用的getDefaultProps,getInitialState方法外,每个组件还有 componentWillMount,componentDidMount,componentWillUpdat