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/

时间: 2024-10-10 17:19:44

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

ASP.NET -- WebForm -- 页面生命周期事件

ASP.NET -- WebForm --  页面生命周期事件在页生命周期的每个阶段中,页将引发可运行您自己的代码进行处理的事件. 1. PreInit: 使用该事件来执行下列操作: 检查 IsPostBack 属性来确定是不是第一次处理该页. 创建或重新创建动态控件. 动态设置主控页. 动态设置 Theme 属性. 读取或设置配置文件属性值. 注意: 如果请求是回发请求,则控件的值尚未从视图状态还原.如果在此阶段设置控件属性,则其值可能会在下一事件中被覆盖. 2. Init   在所有控件都已

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

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

WebForm页面生命周期及asp.net运行机制

1.先上几张原理图着重理解: 现在针对第四副图原理进行解析: 流程: 1.浏览器发送请求 2.服务器软件(IIS)接收,它最终的目的就是为了向客户输出它请求的动态页面生成的html代码. 3.服务器不会处理类和动态页面,所以找扩展程序 4.交给FrameWork,它其中有个类HttpRuntime,其中有个ProcessRequest()方法 5.ProcessRequest()创建了HttpWorkerRequest对象,把请求报文都封装在其中(HttpWorkerRequest中有个指针,它

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

IOS学习笔记37——ViewController生命周期详解

在我之前的学习笔记中讨论过ViewController,过了这么久,对它也有了新的认识和体会,ViewController是我们在开发过程中碰到最多的朋友,今天就来好好认识一下它.ViewController是IOS开发中MVC模式中的C,ViewController是view的controller,ViewController的职责主要包括管理内部各个view的加载显示和卸载,同时负责与其他ViewController的通信和协调.在IOS中,有两类ViewController,一类是显示内容

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

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

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

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

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

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