再学习Webform页面生命周期
参考文章:
在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页面生命周期的更多相关文章
- ASP.Net请求处理机制初步探索之旅 - Part 4 WebForm页面生命周期
开篇:上一篇我们了解了所谓的请求处理管道,在众多的事件中微软开放了19个重要的事件给我们,我们可以注入一些自定义的业务逻辑实现应用的个性化设计.本篇,我们来看看WebForm模式下的页面生命周期. ( ...
- WebForm页面生命周期WEBFORM_ASPNET控件树的生成和作用
WebForm页面生命周期WEBFORM_ASPNET控件树的生成和作用 摘要 页面类是如何结合后台文件类生成整个页面的HTML的代码和后台输出的代码输出到浏览器中呢?这就牵扯到Asp.net页面生命 ...
- ASP.NET -- WebForm -- 页面生命周期事件
ASP.NET -- WebForm -- 页面生命周期事件在页生命周期的每个阶段中,页将引发可运行您自己的代码进行处理的事件. 1. PreInit: 使用该事件来执行下列操作: 检查 IsPos ...
- ASP.NET -- WebForm -- 页面生命周期
ASP.NET -- WebForm -- 页面生命周期 ASP.NET 页运行时,此页将经历一个生命周期,在生命周期中将执行一系列处理步骤.这些步骤包括初始化.实例化控件.还原和维护状态.运行事件 ...
- WebForm页面生命周期及asp.net运行机制
1.先上几张原理图着重理解: 现在针对第四副图原理进行解析: 流程: 1.浏览器发送请求 2.服务器软件(IIS)接收,它最终的目的就是为了向客户输出它请求的动态页面生成的html代码. 3.服务器不 ...
- Asp.net页面生命周期详解任我行(2)-WebForm页面生命周期WEBFORM_ASPNET控件树的生成和作用
摘要 页面类是如何结合后台文件类生成整个页面的HTML的代码和后台输出的代码输出到浏览器中呢?这就牵扯到Asp.net页面生命周期中一个很重要的概念控件树.服务器以反射的方式创建了页面类对象 内容 我 ...
- Android再学习-20141022-Activity的生命周期
20141022-Android再学习 如何在一个应用程序当中定义多个Activity 定义一个类,继承Activity 在该类当中,复写Activity当中的onCreate方法.onCreate( ...
- (转)Asp.net页面生命周期详解任我行(1)-小试牛刀,编写页面代码
原文地址:http://www.cnblogs.com/xuyubing/archive/2013/10/01/3348344.html 前言 很久很久以前,还是我在学校的时候,我就看了传智里面视频, ...
- Asp.net页面生命周期详解任我行(1)-小试牛刀,编写页面代码
前言 很久很久以前,还是我在学校的时候,我就看了传智里面视频,学习了一下Asp.net页面生命周期,当时看的时候,因为内功不够深厚,看起来很吃力,现在回头温习了一下,还是有点收获的,于是想用博客记录一 ...
随机推荐
- xp sp3安装.Net 4.0提示严重错误,0x80070643,解决办法2017版
客户电脑上要装金税开票软件,需要.net 4.0.30319.1,电脑环境是xp sp3,已经安装了.net 2, .net 3.5sp1,安装.net 4.0的时候提示错误0x80070643 因为 ...
- 使用随机数以及扩容表进行join代码
/** * 使用随机数和扩容表进行join */ JavaPairRDD<String, Row> expandedRDD = userid2InfoRDD.flatMapToPair( ...
- Django学习之mysql应用基础
使用pip 安装mysql pip install mysql 使用命令行打开数据库且选择使用已有的数据库 显示已有数据库show databases; 选择已有数据库 use s23; 显示s23数 ...
- 【LG4175】[CTSC2008]网络管理
[LG4175][CTSC2008]网络管理 题面 洛谷 题解 感觉就和普通的整体二分差不太多啊... 树上修改就按时间添加,用树状数组维护一下即可 代码 #include<iostream&g ...
- LeetCode:39. Combination Sum(Medium)
1. 原题链接 https://leetcode.com/problems/combination-sum/description/ 2. 题目要求 给定一个整型数组candidates[ ]和目标值 ...
- 「日常训练」 Yukari's Birthday(ZOJ-3665)
题意与分析 二分题.考虑到n的范围是\(10^{12}\),注意到等比公式\(S=a_1\frac{1-q^n}{1-q} (q\ne 1)\),可以看出,不论q有多大(1除外,这个时候\(r=1,k ...
- Maya Api笔记 - How polygons are handled internally
为加深记忆和理解Maya的Polygon,尝试利用空闲时间翻译Maya Api文档相关章节. How polygons are handled internally - 多边形是如何在内部处理的
- 1.1.0 Unity零基础入门2——Roll a Ball
1. 游戏界面 2.代码 //FoodRotate - - 控制cube旋转 using System.Collections; using System.Collections.Generic; u ...
- hihocoder刷题 扫雷游戏
题目1 : 扫雷游戏 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 给定一个N × N的方格矩阵,其中每个格子或者是'*',表示该位置有一个地雷:或者是'.',表示该位 ...
- 【20180807模拟测试】t1 function
low逼的我也只能写这样的水题... 题面 对于一个整数,定义 f(x)为他的每个数位的阶乘的乘积.例如 f(135)=1! * 3! * 5! =720.给出一个数 a(可以包含前缀零),a 满足他 ...