Web 窗体页处理

楼主
Web 窗体页处理
一般来讲,Web 窗体页的生命周期类似于在服务器上运行的任何 Web 进程的生命周期。Web 处理的某些特性(通过 HTTP 协议传递的信息、Web 页的无状态特性等)应用到 Web 窗体页,就象它们在大多数 Web 应用程序中所做的一样。

但是,ASP.NET 页框架为您执行许多 Web 应用程序服务。例如,ASP.NET 页框架捕获由 Web 窗体页发送的信息,提取相关值,并使信息可通过对象属性访问。

理解在处理 Web 窗体页时发生的事件的顺序是十分重要的。这一知识将帮助您效率更高地对 Web 窗体页和 Web 应用程序进行编程。

Web 窗体页的生命周期
您可能会发现,在检查处理页面时页内所发生情况的详细信息前理解 Web 窗体页在 Web 应用程序中的工作方式的某些基本特性可能会很有帮助。

往返行程
需要理解的最重要概念之一就是 Web 窗体页中工作的划分。浏览器向用户展示一个窗体,用户与该窗体进行交互,这导致该窗体回发到服务器。但是,因为与服务器组件进行交互的所有处理必须在服务器上发生,这意味着对于要求处理的每一操作而言,必须将该窗体发送到服务器、进行处理、然后返回到浏览器。这一事件序列称作“往返行程”。

注意 可以在 Web 窗体中创建客户端脚本,这对于用户输入验证和某些 UI 编程类型十分有用。客户端脚本不与服务器组件交互。
假设这样一种业务方案:用户输入一个订单并且您要确认对该订单有足够的库存,因而您的应用程序在用户订单输入过程中的一个合适的时间点将该页发送给服务器。服务器进程检查该订单,执行库存查找,可能执行在业务逻辑中定义的某些操作(例如修改该页以指示一个错误),然后将该页返回到用户的浏览器以继续。

往返行程


[url=../images/upload_mm/2003/04/17/783787968750.bmp][img]../images/upload_mm/2003/04/17/783787968750s.gif[/img][/url]

在 Web 窗体中,大多数用户操作(例如单击一个按钮)将导致往返行程。因此,ASP.NET 服务器控件中的可用事件通常仅限于 Click 类型的事件。大多数服务器控件公开一个 Click 事件,该事件要求显式的用户操作。

通过相同的标记,服务器控件不公开诸如 onmouseover 之类的高频率事件,因为每次引发此类事件时,将发生到服务器的另一个往返行程,这将显著影响窗体中的响应时间。

重新创建页(视图状态和状态管理)
在任何 Web 方案中,每一次往返行程都需要重新创建页。只要服务器完成处理并完成将页发送到浏览器,它就放弃该页的信息。通过在每一请求后释放服务器资源,可以扩展 Web 应用程序以支持数百或数以千计的同时运行的用户。下一次发送该页时,服务器重新开始创建和处理该页;因此,认为 Web 页是“无状态的”——在服务器上不保留页变量和控件的值。

注意 可以将服务器配置为缓存页信息以优化页,但出于应用程序编程目的,将这些页视作服务器一完成对它们的处理就处置它们最为清晰。
在传统的 Web 应用程序中,服务器所具有的有关一个窗体的唯一信息就是用户已添加到窗体的控件上的信息,因为当发送窗体时将这些信息发送给服务器。其他信息(例如变量值和属性设置)将被放弃。

ASP.NET 通过以下方法克服了这些限制:

它在往返行程间保存页和控件属性。这称作保存控件的视图状态。
它提供状态管理功能,以便您可以在往返行程间保存您自己的变量和特定于应用程序或特定于会话的信息。
它可以检测是第一次请求窗体还是发送窗体,这使您可以相应地进行编程。您可能希望页回发期间的行为与初始请求的行为不同。
事件驱动模型与线性处理模型的优点
如果您具有使用 Active Server Pages (ASP) 的经验,您将认识到 ASP 是线性处理模型。ASP 页是按从上到下的顺序处理的。ASP 代码和静态 HTML 的每一行都按其在文件中的显示顺序进行处理。在往返行程中用户操作导致页被发送到服务器。因为此操作导致往返行程,所以服务器必须重新创建该页。在重新创建该页后,将通过与以前相同的从上到下的顺序对该页进行处理,因此,该页未表现出真正的事件驱动行为。若要创建事件驱动体验,您需要显式设计它。此外,您必须在最基本的级别上显式维护页和控件状态。此模型限制了可以组合的用户界面的丰富程度,并且此模型增加了需要支持它的代码的复杂性。

与此相比,传统 Visual Basic 应用程序中的事件驱动模型包含可编程的元素,这些元素可被初始化并在窗体上显示。用户与这些元素进行交互,而这又导致引发调用事件处理程序的事件。此模型支持真正的事件驱动行为,这在设计上极大拓宽了可以组合的用户界面的丰富程度,并且降低了需要支持它的代码的复杂性。

ASP.NET 通过模拟事件驱动模型的行为代替了 ASP 的线性处理模型。提供 ASP.NET 页框架以隐式地为您建立事件和事件处理程序的关联。利用该页框架,您可以很容易地创建响应用户操作的用户界面。有关创建和使用事件及事件处理程序的详细信息,请参阅 Web 窗体页中的服务器事件处理。

此外,这一相同的框架可以简化页和控件状态管理的实施。有关状态管理的更多信息,请参阅 Web 窗体状态管理。

例如,ASP.NET 使您可为从浏览器传递的事件在服务器代码中设置事件处理程序。假定用户正在与某 Web 窗体页进行交互,该 Web 窗体页包含一个按钮服务器控件。用户单击该按钮控件并引发一个事件,该事件通过 HTTP 发送被传输到服务器中。在该服务器中,ASP.NET 页框架解释发送的信息并将引发的事件与相应的事件处理程序关联。该事件处理程序可以是 ASP.NET 提供的默认处理程序,也可以是您的自定义实现。框架自动为该按钮调用相应的事件处理程序,作为框架正常处理的一部分。因此,您不再需要显式将类似事件的行为设计成线性处理模型。
Web 窗体处理中的各个阶段
ASP.NET 页框架通过不同的阶段对 Web 窗体页进行处理。在 Web 窗体处理的每一阶段,都可能会引发事件,并且将运行与该事件相对应的任何事件处理程序。这些方法向您提供入口点(挂钩),使您可以更新 Web 窗体页的内容。

下表列出了页处理的最普通的阶段,这些阶段发生时引发的事件,以及每一阶段的典型使用。每当请求或发送窗体时就重复这些阶段。Page.IsPostBack 属性使您能够测试是否是第一次处理该页。

  注意 有几个 Web 窗体页处理阶段没有在下表中列出。但是,它们不用于大多数页处理方案。这些阶段主要是由 Web 窗体页上的服务器控件使用,以初始化和呈现它们本身。如果您打算编写自己的 ASP.NET 服务器控件,则需要详细了解这些阶段。

阶段 意义 典型使用
ASP.NET 页框架初始化 引发该页的 Page_Init 事件,并还原该页和控件视图状态。 在此事件期间,ASP.NET 页框架还原控件属性和回发数据。
用户代码初始化 引发页的 Page_Load 事件。 读取和还原以前存储的值:
使用 Page.IsPostBack 属性,检查是否是第一次处理该页。
如果是第一次处理该页,则执行初始数据绑定。
否则,还原控件值。
读取和更新控件属性。
 
验证 调用任何验证程序 Web 服务器控件的 Validate 方法来执行该控件的指定验证。 (此阶段没有用户挂钩。可以在事件处理程序中测试验证的结果。)
事件处理 如果已调用该页来响应窗体事件,则在此阶段期间调用该页中的相应事件处理程序。 执行特定于应用程序的处理:
处理所引发的特定事件。
注意 事件不按特定顺序引发,只有缓存的控件事件(由控件的 AutoPostBack 属性指定)始终在发送事件前处理。
如果该页包含验证类型,则检查该页和各个验证控件的 IsValid 属性。
手动保存您正自行维护的页变量的状态。
检查该页或各个验证控件的 IsValid 属性。
手动保存动态添加到该页的控件的状态。
 
清除 调用 Page_Unload 事件,因为该页已完成呈现并准备好被放弃。 执行最后的清除工作:
关闭文件。
关闭数据库连接。
放弃对象。
注意 显式关闭代价高昂的资源(例如数据库连接)是十分重要的。否则,它们将在下一次发生垃圾回收前一直保持打开。在负荷很重的服务器上,如果有许多资源打开,可能会影响其性能。



电脑版 Page created in 0.0660 seconds with 4 queries.