一般来讲,Web 窗体页的生命周期类似于在服务器上运行的任何 Web 进程的生命周期。Web 处理的某些特性(通过 HTTP 协议传递的信息、Web 页的无状态特性等)应用到 Web 窗体页,就象它们在大多数 Web 应用程序中所做的一样。
但是,ASP.NET 页框架为您执行许多 Web 应用程序服务。例如,ASP.NET 页框架捕获由 Web 窗体页发送的信息,提取相关值,并使信息可通过对象属性访问。
理解在处理 Web 窗体页时发生的事件的顺序是十分重要的。这一知识将帮助您效率更高地对 Web 窗体页和 Web 应用程序进行编程。
Web 窗体页的生命周期
您可能会发现,在检查处理页面时页内所发生情况的详细信息前理解 Web 窗体页在 Web 应用程序中的工作方式的某些基本特性可能会很有帮助。
往返行程
需要理解的最重要概念之一就是 Web 窗体页中工作的划分。浏览器向用户展示一个窗体,用户与该窗体进行交互,这导致该窗体回发到服务器。但是,因为与服务器组件进行交互的所有处理必须在服务器上发生,这意味着对于要求处理的每一操作而言,必须将该窗体发送到服务器、进行处理、然后返回到浏览器。这一事件序列称作“往返行程”。
注意 可以在 Web 窗体中创建客户端脚本,这对于用户输入验证和某些 UI 编程类型十分有用。客户端脚本不与服务器组件交互。
假设这样一种业务方案:用户输入一个订单并且您要确认对该订单有足够的库存,因而您的应用程序在用户订单输入过程中的一个合适的时间点将该页发送给服务器。服务器进程检查该订单,执行库存查找,可能执行在业务逻辑中定义的某些操作(例如修改该页以指示一个错误),然后将该页返回到用户的浏览器以继续。
重新创建页(视图状态和状态管理)
在任何 Web 方案中,每一次往返行程都需要重新创建页。只要服务器完成处理并完成将页发送到浏览器,它就放弃该页的信息。通过在每一请求后释放服务器资源,可以扩展 Web 应用程序以支持数百或数以千计的同时运行的用户。下一次发送该页时,服务器重新开始创建和处理该页;因此,认为 Web 页是“无状态的”——在服务器上不保留页变量和控件的值。
注意 可以将服务器配置为缓存页信息以优化页,但出于应用程序编程目的,将这些页视作服务器一完成对它们的处理就处置它们最为清晰。
在传统的 Web 应用程序中,服务器所具有的有关一个窗体的唯一信息就是用户已添加到窗体的控件上的信息,因为当发送窗体时将这些信息发送给服务器。其他信息(例如变量值和属性设置)将被放弃。
ASP.NET 通过以下方法克服了这些限制:
它在往返行程间保存页和控件属性。这称作保存控件的视图状态。
它提供状态管理功能,以便您可以在往返行程间保存您自己的变量和特定于应用程序或特定于会话的信息。
它可以检测是第一次请求窗体还是发送窗体,这使您可以相应地进行编程。您可能希望页回发期间的行为与初始请求的行为不同。
事件驱动模型与线性处理模型的优点
如果您具有使用 Active Server Pages (ASP) 的经验,您将认识到 ASP 是线性处理模型。ASP 页是按从上到下的顺序处理的。ASP 代码和静态 HTML 的每一行都按其在文件中的显示顺序进行处理。在往返行程中用户操作导致页被发送到服务器。因为此操作导致往返行程,所以服务器必须重新创建该页。在重新创建该页后,将通过与以前相同的从上到下的顺序对该页进行处理,因此,该页未表现出真正的事件驱动行为。若要创建事件驱动体验,您需要显式设计它。此外,您必须在最基本的级别上显式维护页和控件状态。此模型限制了可以组合的用户界面的丰富程度,并且此模型增加了需要支持它的代码的复杂性。
ASP.NET 通过模拟事件驱动模型的行为代替了 ASP 的线性处理模型。提供 ASP.NET 页框架以隐式地为您建立事件和事件处理程序的关联。利用该页框架,您可以很容易地创建响应用户操作的用户界面。有关创建和使用事件及事件处理程序的详细信息,请参阅 Web 窗体页中的服务器事件处理。
此外,这一相同的框架可以简化页和控件状态管理的实施。有关状态管理的更多信息,请参阅 Web 窗体状态管理。
例如,ASP.NET 使您可为从浏览器传递的事件在服务器代码中设置事件处理程序。假定用户正在与某 Web 窗体页进行交互,该 Web 窗体页包含一个按钮服务器控件。用户单击该按钮控件并引发一个事件,该事件通过 HTTP 发送被传输到服务器中。在该服务器中,ASP.NET 页框架解释发送的信息并将引发的事件与相应的事件处理程序关联。该事件处理程序可以是 ASP.NET 提供的默认处理程序,也可以是您的自定义实现。框架自动为该按钮调用相应的事件处理程序,作为框架正常处理的一部分。因此,您不再需要显式将类似事件的行为设计成线性处理模型。
Web 窗体处理中的各个阶段
ASP.NET 页框架通过不同的阶段对 Web 窗体页进行处理。在 Web 窗体处理的每一阶段,都可能会引发事件,并且将运行与该事件相对应的任何事件处理程序。这些方法向您提供入口点(挂钩),使您可以更新 Web 窗体页的内容。