参考文章:

在vs2010,新建一个aspx页面,页面头部有一行代码:

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Index2.aspx.cs" Inherits="testWebForm.Index2" %>

Page Language="C#" 是指出页面编写语言为c#,这个可能是给页面解析引擎(非官方称呼自己理解)看的吧。

AutoEventWireup="true" 这个属性设置为true,会给页面的服务器控件事件,自动添加事件绑定代码(有vs开发工具生成,程序不理解,控件的事件也可以正常执行)。

CodeBehind="Index2.aspx.cs" 这个是指,页面后置类是哪一个类,asp.net webform有一个打特点就是代码后置,解决页面多种代码(html,css,js,C#,asp语法)写在一个页面,asp页面代码乱的问题。

Inherits="testWebForm.Index2"  单词Inherits是继承的意思,也就是说在服务器页面解析引擎执行时,将会把页面解析为testWebForm.Index2的一部分(有可能是子类或者是一个类也说不定,这只是我的理解,具体需要研究确认),总之这个代码后置属性与继承属性的标出,都是为了将来解析引擎能理解cs文件和aspx文件,并进行解析执行服务的。

补充:从编程经验来看,我们可以在aspx页面访问到后台的属性以及public、protected修饰的字段,所以解析引擎有可能把aspx页与cs、designer解析成了一个类。 cs文件和designer.cs文件本身都是属于一个类,这里用了部分类关键字 partial。

现在来想一个问题,为什么有页面生命周期呢?

因为客户端请求http://192.169.1.100:8080/index.aspx页面,服务器不是直接去读取index.aspx文件,然后返回的。

这里大概流程:首先要找到aspx页面,然后根据页面的头部标识(上面已经说明),在dll代码中找到它的另外一部分(cs代码部分,这部分发布网站时,都被编译成了dll文件)然后根据designer.cs中的属性(这部分是当时你往页面拖放控件时,vs自动帮你生成的代码)一个一个去aspx页面找到对应的html部分如:

designer.cs中生成的一个属性:

/// <summary>
/// Label1 控件。
/// </summary>
/// <remarks>
/// 自动生成的字段。
/// 若要进行修改,请将字段声明从设计器文件移到代码隐藏文件。
/// </remarks>
protected global::System.Web.UI.WebControls.Label Label1;

在aspx页面有一个asp.net服务器控件与之对应:

<asp:Label ID="Label1" runat="server" Text="Label" ViewStateMode="Disabled"></asp:Label>

然后属性Label1是Label 类型的,这个Label类有很多属性:

namespace System.Web.UI.WebControls
{
// 摘要:
// 表示在网页上显示文本的标签控件。
[ControlValueProperty("Text")]
[ControlBuilder(typeof(LabelControlBuilder))]
[ParseChildren(false)]
[DataBindingHandler("System.Web.UI.Design.TextDataBindingHandler, System.Design, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a")]
[Designer("System.Web.UI.Design.WebControls.LabelDesigner, System.Design, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a")]
[ToolboxData(@"<{0}:Label runat=""server"" Text=""Label""></{0}:Label>")]
[DefaultProperty("Text")]
public class Label : WebControl, ITextControl
{
// 摘要:
// 初始化 System.Web.UI.WebControls.Label 类的新实例。
[TargetedPatchingOptOut("Performance critical to inline this type of method across NGen image boundaries")]
public Label(); // 摘要:
// 获取或设置 System.Web.UI.WebControls.Label 控件关联的服务器控件的标识符。
//
// 返回结果:
// 一个字符串,对应于 Web 窗体中包含的服务器控件的 System.Web.UI.Control.ID。默认值为空字符串 (""),指示 System.Web.UI.WebControls.Label
// 控件不与其他服务器控件相关联。
[TypeConverter(typeof(AssociatedControlConverter))]
[IDReferenceProperty]
[DefaultValue("")]
[WebCategory("Accessibility")]
[WebSysDescription("Label_AssociatedControlID")]
[Themeable(false)]
public virtual string AssociatedControlID { get; set; }
//
// 摘要:
// 获取一个值,该值指示在控件的 System.Web.UI.WebControls.WebControl.IsEnabled 属性为 false 时,控件是否应将呈现的
// HTML 元素的 disabled 特性设置为“disabled”。
//
// 返回结果:
// 如果 System.Web.UI.Control.RenderingCompatibility 属性指示 ASP.NET 版本低于 4.0,则为
// true;否则为 false。
public override bool SupportsDisabledAttribute { get; }
//
// 摘要:
// 获取用于呈现 System.Web.UI.WebControls.Label 控件的 HTML 标记。
//
// 返回结果:
// 用于呈现 System.Web.UI.WebControls.Label 的 System.Web.UI.HtmlTextWriterTag 值。
protected override HtmlTextWriterTag TagKey { get; }
//
// 摘要:
// 获取或设置 System.Web.UI.WebControls.Label 控件的文本内容。
//
// 返回结果:
// 控件的文本内容。默认值为 System.String.Empty。
[Bindable(true)]
[Localizable(true)]
[WebCategory("Appearance")]
[DefaultValue("")]
[WebSysDescription("Label_Text")]
[PersistenceMode(PersistenceMode.InnerDefaultProperty)]
public virtual string Text { get; set; } // 摘要:
// 添加要呈现到指定输出流的 System.Web.UI.WebControls.Label 控件的 HTML 属性和样式。
//
// 参数:
// writer:
// System.Web.UI.HtmlTextWriter,表示要在客户端呈现 HTML 内容的输出流。
//
// 异常:
// System.Web.HttpException:
// 未能找到 System.Web.UI.WebControls.Label.AssociatedControlID 属性中指定的控件。
protected override void AddAttributesToRender(HtmlTextWriter writer);
//
// 摘要:
// 通知控件某元素已经过分析,并将该元素添加到 System.Web.UI.WebControls.Label 控件。
//
// 参数:
// obj:
// 表示已分析元素的对象。
protected override void AddParsedSubObject(object obj);
//
// 摘要:
// 加载以前保存的控件的状态。
//
// 参数:
// savedState:
// 包含控件的已保存视图状态值的对象。
protected override void LoadViewState(object savedState);
//
// 摘要:
// 将 System.Web.UI.WebControls.Label 的内容呈现到指定的编写器中。
//
// 参数:
// writer:
// 向客户端呈现 HTML 内容的输出流。
protected internal override void RenderContents(HtmlTextWriter writer);
}
}

以上是我复制的Label类的代码。你在aspx页为控件属性赋的值,会在解析后赋值给Label类的属性。上面我们说到aspx页面的asp.net服务器控件,与designer.cs的属性都是一一对应的,在页面解析引擎执行时,都会被对比解析。然而这说明了什么呢?

这是为了说明什么?aspx页面之所以有生命周期,是因为要做这些解析,其实其他页面也都有生命周期不过他们很短。

如果我们aspx页面不用服务器控件,也就会少了这一步解析,没有这一步解析页面就与普通的asp或者php的编程模型很类似了。

即使没有了服务器控件,但是不代表页面不需要解析,我们页面写的给页面的不同地方如<h2><%=title%></h2>这个给页面绑定标题的这种标签语法,还有其他各种绑定代码都是需要解析执行的。这就是为什么把webform叫做动态服务页面的原因吧。

需要明确的是:在<%%>中写代码和在cs文件中没有本质区别,它们是一样的,只不过<%%>可以灵活的控制将来生成的html页面,不同地方显示不同内容。

参考资料:网络上其他很多博客

再学习Webform页面生命周期的更多相关文章

  1. ASP.Net请求处理机制初步探索之旅 - Part 4 WebForm页面生命周期

    开篇:上一篇我们了解了所谓的请求处理管道,在众多的事件中微软开放了19个重要的事件给我们,我们可以注入一些自定义的业务逻辑实现应用的个性化设计.本篇,我们来看看WebForm模式下的页面生命周期. ( ...

  2. WebForm页面生命周期WEBFORM_ASPNET控件树的生成和作用

    WebForm页面生命周期WEBFORM_ASPNET控件树的生成和作用 摘要 页面类是如何结合后台文件类生成整个页面的HTML的代码和后台输出的代码输出到浏览器中呢?这就牵扯到Asp.net页面生命 ...

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

    ASP.NET -- WebForm --  页面生命周期事件在页生命周期的每个阶段中,页将引发可运行您自己的代码进行处理的事件. 1. PreInit: 使用该事件来执行下列操作: 检查 IsPos ...

  4. ASP.NET -- WebForm -- 页面生命周期

    ASP.NET -- WebForm --  页面生命周期 ASP.NET 页运行时,此页将经历一个生命周期,在生命周期中将执行一系列处理步骤.这些步骤包括初始化.实例化控件.还原和维护状态.运行事件 ...

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

    1.先上几张原理图着重理解: 现在针对第四副图原理进行解析: 流程: 1.浏览器发送请求 2.服务器软件(IIS)接收,它最终的目的就是为了向客户输出它请求的动态页面生成的html代码. 3.服务器不 ...

  6. Asp.net页面生命周期详解任我行(2)-WebForm页面生命周期WEBFORM_ASPNET控件树的生成和作用

    摘要 页面类是如何结合后台文件类生成整个页面的HTML的代码和后台输出的代码输出到浏览器中呢?这就牵扯到Asp.net页面生命周期中一个很重要的概念控件树.服务器以反射的方式创建了页面类对象 内容 我 ...

  7. Android再学习-20141022-Activity的生命周期

    20141022-Android再学习 如何在一个应用程序当中定义多个Activity 定义一个类,继承Activity 在该类当中,复写Activity当中的onCreate方法.onCreate( ...

  8. (转)Asp.net页面生命周期详解任我行(1)-小试牛刀,编写页面代码

    原文地址:http://www.cnblogs.com/xuyubing/archive/2013/10/01/3348344.html 前言 很久很久以前,还是我在学校的时候,我就看了传智里面视频, ...

  9. Asp.net页面生命周期详解任我行(1)-小试牛刀,编写页面代码

    前言 很久很久以前,还是我在学校的时候,我就看了传智里面视频,学习了一下Asp.net页面生命周期,当时看的时候,因为内功不够深厚,看起来很吃力,现在回头温习了一下,还是有点收获的,于是想用博客记录一 ...

随机推荐

  1. JSP/Servlet开发——第二章 JSP数据交互(一)

    1. JSP内置对象:JSP内置对象是 Web 容器创建的一组对象:   ●JSP常用的内置对象:out.request.application.session.response等: ●内置对象不需要 ...

  2. JQuery制作网页—— 第七章 jQuery中的事件与动画

    1. jQuery中的事件: ●和WinForm一样,在网页中的交互也是需要事件来实现的,例如tab切换效果,可以通过鼠标单击事件来实现 ●jQuery事件是对JavaScript事件的封装,常用事件 ...

  3. 学习新框架laravel4 第一天(- -! 新公司版本使用的4,所以还要重新学习)

    路由使用: //根目录 Route::get('/', function() { return View::make('hello'); }); 自定义模板: /app/views/home/inde ...

  4. For-each Loop,Index++ Loop , Iterator 那个效率更高

    平时在写Java/C# 程序的时候,会写很多的Loop 语句,for() 及 Iterator loop 及Java 8 的foreach Loop, 这些Loop 那种效率最高呢?写个小程序测试一下 ...

  5. 智能家居系统 Home Assistant 系列 --安装系统之Windows

    Home Assistant 是一个成熟完整的基于 Python 的智能家居系统. 首先得安装Python环境.在浏览器中访问Python官网 www.python.org 进入Downloads中的 ...

  6. POJ-2155:Matrix(二维树状数祖)

    Matrix Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 31892   Accepted: 11594 Descript ...

  7. React Router 4.0 实现路由守卫

    在使用 Vue 或者 Angular 的时候,框架提供了路由守卫功能,用来在进入某个路有前进行一些校验工作,如果校验失败,就跳转到 404 或者登陆页面,比如 Vue 中的 beforeEnter 函 ...

  8. 6、Java并发编程:volatile关键字解析

    Java并发编程:volatile关键字解析 volatile这个关键字可能很多朋友都听说过,或许也都用过.在Java 5之前,它是一个备受争议的关键字,因为在程序中使用它往往会导致出人意料的结果.在 ...

  9. Docker - vim安装

    在使用docker容器时,有时候里边没有安装vim,敲vim命令时提示说:vim: command not found,这个时候就需要安装vim. apt-get install vim 若提示: R ...

  10. python3 爬虫爬取深圳公租房轮候库(深圳房网)

    深圳公租房轮候库已经朝着几十万人的规模前进了,这是截至16年10月之前的数据了,贴上来大家体会下 所以17年已更新妥妥的10W+ 今天就拿这个作为爬虫的练手项目 1.环境准备: 操作系统:win10 ...