asp.net的出现,打破了这种传统;asp.net采用了codebehind技术和服务器端控件,加入了服务器端的事件的概念,改变了脚本语言编写的模式,更加贴近window编程,使web编程更加简单、直观;但是我们要看到,asp.net本身并没有改变web编程的基本模式,只是封装了一些细节、提供了一些易用的功能,使代码更容易编写和维护;从某种程度上来说,将服务器端执行的方式复杂化了,这就是我们今天要讨论的主体:asp.net web page的生存周期。
这个问题实际上并不复杂,各位使用asp.net编程的朋友可以到你们的系统盘:/windows/microsoft.net/framework/<版本号>/temporary asp.net files这个目录下,这个下面就放了所有本机上存在的asp.net应用程序的临时文件,子目录的名称就是应用程序的名称,然后再下去两层(为了保证唯一,asp.net自动产生了两层子目录,并且子目录名称是随机的),然后我们会发现有很多类似:“yfy1gjhc.dll”、“xeunj5u3.dll”这样的链接库以及“komee-bp.0.cs”、“9falckav.0.cs”这样的源文件,实际上这就是aspx被asp.net动态编译后的结果,打开这些源文件我们可以发现:
public class webform_aspx : mynamespace.webform, system.web.sessionstate.irequiressessionstate 这就印证了我们前面的说法,aspx是代码绑定类的子类,它的名称是aspx文件名加上“_aspx”后缀,通过研究这些代码我们可以发现,实际上所有aspx中定义的服务器控件都是在这些代码中生成的,然后动态产生这些代码的时候,把原来在aspx中嵌入的代码写在了相应的位置。
“每次请求 asp.net 页时,服务器就会加载一个 asp.net 页,并在请求完成时卸载该页。页及其包含的服务器控件负责执行请求并将 html 呈现给客户端。虽然客户端和服务器之间的通讯是无状态的和断续的,但是必须使客户感觉到这是一个连续执行的过程。”
“这种连续性假象是由 asp.net 页框架、页及其控件实现的。回发后,控件的行为必须看起来是从上次 web 请求结束的地方开始的。虽然 asp.net 页框架可使执行状态管理相对容易一些,但是为了获得连续性效果,控件开发人员必须知道控件的执行顺序。控件开发人员需要了解:在控件生命周期的各个阶段,控件可使用哪些信息、保持哪些数据、控件呈现时处于哪种状态。例如,在填充页上的控件树之前控件不能调用其父级。” “下表提供了控件生命周期中各阶段的高级概述。有关详细信息,请点击表中的链接。”