回头再学Asp.net系列--基础篇(一)
Web Page的生命周期与Postback
参考 http://www.cnblogs.com/artech/archive/2007/04/06/702658.html
了解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。我们来看该方法的定义。
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方法是如何定义的:
{
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:
function postback()
{
__doPostBack('Button1','');
}
document.getElementById("Button2").onclick = postback;
document.getElementById("Button3").onclick = postback;
</script>
转载于:https://www.cnblogs.com/dubing/articles/2171374.html
回头再学Asp.net系列--基础篇(一)相关推荐
- 回头再学Asp.net系列--基础篇(六)
随着面向对象分析与设计的发展,一个良好的设计,核心原则之一就是将变化隔离,使得变化部分发生变化时,不变部分不受影响(这也是OCP的目的).为了做到这一点,要利用面向对象中的多态性,使用多态性后,客户类 ...
- 从零开始学ASP.NET(基础篇)
原作者:蓝鲸 出处:5D多媒体 学ASPNET与ASP有区别,这种区别不是语言上的,而是思路上的区别.ASP是纯面向过程的,而ASPNET是完全面向对向的.这种区别使我们在编程的结构设计上要与ASP有 ...
- Asp.net系列--基础篇(一)
Web Page的生命周期与Postback 了解ASP.NET Web Page的生命周期对于一个做WEB开发的工程师来说很有必要,尤其是用于编写自己的control的时候. ASP.NET Web ...
- Asp.net系列--基础篇(二)
栈(Stack)和堆(Heap). 栈是在程序运行过程中用于保存指令,值类型变量的内存区域(一个线程对应一个栈),栈的结构和数据结构中"栈"的结构是一样的,"先进后出&q ...
- 一起学Pandas系列基础篇---loc和iloc
一起学Pandas系列基础篇-loc和iloc 一起学Pandas系列基础篇---loc和iloc 一起学Pandas系列基础篇---loc和iloc 本篇学习内容介绍 一.loc 1. 选择索引为0 ...
- 一起学Pandas系列基础篇---at和iat
一起学Pandas系列基础篇-数据选择之at和iat 一起学Pandas系列基础篇---at和iat 一起学Pandas系列基础篇---数据选择之at和iat 本篇学习内容介绍 一.at 1. 选择B ...
- 一点一点学ASP.NET之基础概念——委托
委托的概念 委托实际上是类(一个貌似函数一样的类),我们已经使用函数指针很多年了--函数指针也被称为过程类型,但是它们的实现都不是类.它们是单独的函数指针的简单实例.委托是包含这些功能的类,委托类通过 ...
- 少儿创意学编程(Scratch基础篇):第6课——赛艇比赛
<少儿创意学编程(Scratch基础篇)>,参考了英国公益组织发起的"code club(代码俱乐部)"--少儿免费学编程活动.愿为中国的少儿创意编程教育尽微薄之力,对 ...
- SQL Server调优系列基础篇(子查询运算总结)
前言 前面我们的几篇文章介绍了一系列关于运算符的介绍,以及各个运算符的优化方式和技巧.其中涵盖:查看执行计划的方式.几种数据集常用的连接方式.联合运算符方式.并行运算符等一系列的我们常见的运算符.有兴 ...
最新文章
- video php上下切换,TP3.2实现上下篇切换
- [深入学习Redis]RedisAPI的原子性分析
- javascript中insertRow(index) 和insertCell(index)
- [WPF] 托盘菜单的基本功能实现
- 如何把html文件转化为mp3,如何将Flash转换为MP3
- 胡适先生1934年《赠与大学毕业生的话》
- 计算机CPU像人的大脑,人脑与电脑的相似性与差异性及全球脑
- 投资,什么是真正的风险?
- 无限制神器aria2懒人包及Aria2配置/Web管理面板教程
- IIS Express配置使通过IP访问
- win10弹出计算机的内存不足,win10提示计算机显卡内存不足情况的解决办法介绍...
- [Excel]vlookup的内在逻辑以及模糊检索
- 判断回文串,最长回文串方法
- 红米越卖越贵,消费者如今总算有了新选择,魅蓝回来了
- “蘑菇书“配套在线课程上线
- 小米将推运动相机无疑,但它进入的是个怎样的市场?
- iOS越狱程序开发框架
- 取消ctrl+alt+left旋转桌面
- 伺服的基础知识及简单应用
- 局域网即时通信软件都有哪些?要如何选择?
热门文章
- feign调用多个服务_Spring Cloud多个微服务之间调用代码实例
- 汇编语言w3c_w3cschoolc语言教程
- eip协议通信_3月免费公开课伺服、通信等课程重磅发布,火热报名中
- 日积月累真的很可怕,记住这些编程单词,两周学会敲代码
- android中menu菜单扩增_【已解决】Android添加Menu菜单
- 教你如何在C++二进制文件中注入git信息
- 嵌入式和机械哪个好?机械转嵌入式好转吗?
- HDU1527(博弈论)
- python里感叹号什么意思_仪表盘上的感叹号是什么意思
- 本科计算机学渣,2017计算机老学渣的经验教训