Web Page的生命周期与Postback

了解ASP.NET Web Page的生命周期对于一个做WEB开发的工程师来说很有必要,尤其是用于编写自己的control的时候。

ASP.NET Web Page的生命周期可以基本分为以下几个阶段:

1.  Page request

本页面被请求时发生在web page生命周期之前, 当有一个页面被请求时,ASP.NET引擎要判断一下这个页面是否需要经过编译或者直接通过此页面的缓冲版本直接发给请求者。

2.  Start

在这阶段,Page的Request,Response,IsPostBack,UICulture 属性被适当设置。

3.  Page initialization

在此阶段,每一个control的UniqueID属性被设置,页面的主题也被应用,如果此页面是回传页面,即Page的IsPostBack属性为true,那么页面里各个控件的新的值和ViewState还没有在此阶段被恢复。

4.  Load

在此阶段,如果页面是回传页面,择页面里各个控件的新的值和ViewState将被恢复或设置。

5.  Validation

在此阶段,页面中验证控件调用自己的Validate方法进行验证以便设置自己的IsValid属性,因为验证控件是在客户端和服务器端都要进行验证的。

6.  Postback event handling

在此阶段所有的委托事件将被调用,我们所有的事件处理代码是在此时被调用的。

7.  Rendering

在此阶段Page调用每个控件的Render方法将各个控件对应的html文本流写到Response的OutputStream属性中,在此阶段之前,每个控件将再次保存各自的ViewState,因此我们还是有最后一次机会在Page的PreRender方法中改变控件的ViewState属性的。

8.  Unload

在此阶段,当初为Page及每个控件建立的实体都将被删除,资源被释放。

Postback

从HTML 被Render到Client端,到用户Click某个按钮,输入被Postback到Server端,并触发两个Event,执行Event Handler打印出相关的Message。

ASP.NET设计的Page Render到Client端的HTML中:__EVENTTARGET代表触发Event的Control的Unique name;__EVENTARGUMENT代表为Event Handler定义的额外的参数;__VIEWSTATE:代表的是Viewstate。定义了一个__doPostBack function完成Postback的操作,该function只有区区3行代码,前两行通过参数对之前定义的两个hidden field赋值,然后向Server端提交表单。

对于一个System.Web.UI.WebControls.Button,默认采用<input type="submit">的方式提交,通过设置UseSubmitBehavior属性(这个属性时ASP.NET 2.0新加的,1x没有相应的设置),改变button表单提交的行为。

我们来看看Server如何处理这个Postback,关于Web Page的生命周期在这里就不详细介绍了。Server端通过__EVENTTARGET这个hidden field的值找到对应的Server端的Control,通过Reflection确定该Control是否实现了System.Web.UI.IPostBackEventHandler Interface。如果该Control确实实现了该Interface,那么调用Page的RaisePostBackEvent方法,这是一个Virtual的方法,可以被Override。我们来看该方法的定义。

[EditorBrowsable(EditorBrowsableState.Advanced)]

protected virtual void RaisePostBackEvent(IPostBackEventHandler sourceControl, string eventArgument)

{

sourceControl.RaisePostBackEvent(eventArgument);

}

我们可以看到该方法直接调用该sourceControl的RaisePostBackEvent,并传入一个eventArgument参数,在这个例子中sourceControl就是__EVENTTARGET对应的Web Control:Button2,eventArgument就是__EVENTTARGET对应的值:一个空字符串。Button2的类型是System.Web.UI.WebControls.Button。我们来看看System.Web.UI.WebControls.Button中的RaisePostBackEvent方法是如何定义的:

protected virtual void RaisePostBackEvent(string eventArgument)

{

base.ValidateEvent(this.UniqueID, eventArgument);

if (this.CausesValidation)

{

this.Page.Validate(this.ValidationGroup);

}

this.OnClick(EventArgs.Empty);

this.OnCommand(new CommandEventArgs(this.CommandName, this.CommandArgument));

}

这个方法也很简单,先进行Validation,然后先后出发两个Event:OnClick 和OnCommand,随后调用对应的Event handler,这和我们的输出结果是吻合的。

这基本上就是整个Postback的整个程序执行的过程,现在我们对我们的Page作一些小的有趣的改动,来验证一下:

Client端和Server端进行交互的途径就是提交表单(Form Submitting),而我们现在有两种方式来提交表单:通过<input type="submit">控件;通过调用javascript:__doPostBack。基于这一点我们在Html中加了下面一段javascript:

<script type="text/javascript">

function postback()

{

__doPostBack('Button1','');

}

document.getElementById("Button2").onclick = postback;

document.getElementById("Button3").onclick = postback;

</script>

参考 http://www.2cto.com/kf/201111/110866.html

转载于:https://www.cnblogs.com/jaryup/archive/2011/12/02/2272138.html

Asp.net系列--基础篇(一)相关推荐

  1. 回头再学Asp.net系列--基础篇(一)

    Web Page的生命周期与Postback 参考 http://www.cnblogs.com/artech/archive/2007/04/06/702658.html 了解ASP.NET Web ...

  2. 回头再学Asp.net系列--基础篇(六)

    随着面向对象分析与设计的发展,一个良好的设计,核心原则之一就是将变化隔离,使得变化部分发生变化时,不变部分不受影响(这也是OCP的目的).为了做到这一点,要利用面向对象中的多态性,使用多态性后,客户类 ...

  3. Asp.net系列--基础篇(二)

    栈(Stack)和堆(Heap). 栈是在程序运行过程中用于保存指令,值类型变量的内存区域(一个线程对应一个栈),栈的结构和数据结构中"栈"的结构是一样的,"先进后出&q ...

  4. SQL Server调优系列基础篇(子查询运算总结)

    前言 前面我们的几篇文章介绍了一系列关于运算符的介绍,以及各个运算符的优化方式和技巧.其中涵盖:查看执行计划的方式.几种数据集常用的连接方式.联合运算符方式.并行运算符等一系列的我们常见的运算符.有兴 ...

  5. SQL Server调优系列基础篇(联合运算符总结)

    前言 上两篇文章我们介绍了查看查询计划的方式,以及一些常用的连接运算符的优化技巧,本篇我们总结联合运算符的使用方式和优化技巧. 废话少说,直接进入本篇的主题. 技术准备 基于SQL Server200 ...

  6. SQL Server 调优系列基础篇 - 子查询运算总结

    前言 前面我们的几篇文章介绍了一系列关于运算符的介绍,以及各个运算符的优化方式和技巧.其中涵盖:查看执行计划的方式.几种数据集常用的连接方式.联合运算符方式.并行运算符等一系列的我们常见的运算符.有兴 ...

  7. SQL Server调优系列基础篇(常用运算符总结)

    原文:SQL Server调优系列基础篇(常用运算符总结) 前言 上一篇我们介绍了如何查看查询计划,本篇将介绍在我们查看的查询计划时的分析技巧,以及几种我们常用的运算符优化技巧,同样侧重基础知识的掌握 ...

  8. Ansible系列-基础篇-Ansible Inventory的合理化配置

    欢迎关注个人公众号 DailyJobOps 原文地址:Ansible系列-基础篇-Ansible Inventory的合理化配置 这里写目录标题 Ansible Inventory内置参数 Inven ...

  9. 一起学Pandas系列基础篇---loc和iloc

    一起学Pandas系列基础篇-loc和iloc 一起学Pandas系列基础篇---loc和iloc 一起学Pandas系列基础篇---loc和iloc 本篇学习内容介绍 一.loc 1. 选择索引为0 ...

最新文章

  1. 论文:基于粒子群优化的测试数据生成及其实证分析-----生成过程以及实验(计算机研究与发展)
  2. apache2配置和使用
  3. 滚动后如何检查元素是否可见?
  4. 微软 Build 2017 开发者大会:Azure 与 AI 的快速发展
  5. 安卓移植和驱动开发第八章心得体会
  6. jstack命令:教你如何排查多线程问题
  7. android studio打包纯H5项目(集成5+SDK)
  8. java dos 菜单栏_学习java之电脑的常用快捷键和DOS窗口下的常用命令
  9. java程序员饱和了吗?
  10. 阿里P6Java工程师的学习经历自述,希望新人少走弯路
  11. 【预测模型】基于matlab BP神经网络预测【含Matlab源码 221期】
  12. 基于python及图像识别的围棋棋盘棋子识别2——定位棋子位置及识别棋子颜色
  13. 零基础怎样自学编程?初学者如何学习编程?编程学习入门指南(文章较长,需要耐心看完)
  14. CCNA实验前准备(转)
  15. 使用约会应用Tinder时没人关注你?花钱就能插队露脸半小时
  16. PPT卡片排版技巧,快来收藏
  17. 本机不装Oracle,远程访问服务器上Oracle教程
  18. 启英泰伦产品方案开发流程
  19. 我和Double Lift的故事(五)——升华篇​
  20. 使用VSccde上传文件到Git时报错:fatal:Custom certificate bundle not found at path: F:/python错图墩铝?git娴狂球糕减裱镑勒惊/Gi

热门文章

  1. python【力扣LeetCode算法题库】912- 排序数组
  2. Python程序设计题解【蓝桥杯官网题库】 DAY9-基础练习
  3. 搭建Ubuntu18.04+Anaconda3.x+Pycharm+SimpleITK(二)
  4. 参数构造错误 微信_快速掌握前端开发中的常见错误
  5. 几何画板200个经典课件_几何画板Sketchpad Mac(数学教学软件)中文版
  6. spring vo是什么_DO、VO、DTO...XXOO,你弄明白了么
  7. 32位crc校验码程序_CRC码计算及校验原理的最通俗诠释
  8. 宁波网络推广分享能让新站提升收录的技巧!
  9. 浅析从小米造车背后探索小米集团的企业网络推广策略会有怎样的灿烂
  10. 网络推广外包——网络推广外包如何在搜索引擎中体现关键词优化效果