用一个案例看懂ASP.NET页面处理流程
2018-12-10王雅新
王雅新
【摘 要】Web页面是asp.net应用程序的重要组成部分,理解页面生命周期中执行的一系列步骤对软件代码的设计和优化非常重要。文章通过对单选按钮功能调试的案例剖析,分析和演示了Web页面处理过程中几个重要的生命周期阶段对页面交互数据的影响以及相关的代码处理。
【关键词】案例;页面生命周期
中图分类号: TP393.092 文献标识码: A 文章编号: 2095-2457(2018)21-0071-002
DOI:10.19694/j.cnki.issn2095-2457.2018.21.032
【Abstract】Web Form are an important part of ASP.Net applications,and it is important to understand the sequence of steps that are executed in the Asp.Net Form life cycle for the design and optimization of software code.This paper analyzes and demonstrates the influence of several important life cycle stages of Web Form processing on page interaction data and relevant code processing through case analysis of the function debugging of radio buttons.
【Key words】Case;Web Form Life Cycle
1 案例调试中的排错处理
在一个用于教学的软件系统的设计中,要完成一个从数据库中获取信息并在页面中显示的功能。在Web页面设计中,性别数据使用了两个单选按钮控件RadioButton,其他数据都用TextBox控件显示。数据库信息的检索和显示是通过按钮的事件来处理的,页面结构如下图所示:
图1
从图中可以看出,当在学号文本框中输入学号信息,点击提交按钮后,数据库中的查询结果信息就应该正确显示出来了。但是,在实际调试运行中,查询结果中性别信息的显示令人迷茫,我用了三个学号测试数据,对应的数据库中的性别字段值分别是“男,女,男”,第一次输入关键字,提交查询,页面能够正确显示数据库中的数据信息;然后,修改查询关键字,再次提交,页面也能够正确显示查询结果;再输入第三个學号信息,提交后,单选按钮显示的是“女”被选中,除了单选按钮信息不正确外,其他信息都正确显示。换一组学号测试数据,对应的数据库中的性别字段值分别是“女,男”,结果显示,第一次提交查询,能够正确显示数据库信息,但是,第二次输入对应性别为“男”的学号信息时,查询结果显示的还是“女”单选按钮选中的状态,除了性别信息显示不正确外,其他数据库信息显示都正确。在按钮事件代码中,依据数据库的查询结果设置单选按钮的代码如下:
if (dr.GetBoolean(2) == true)
RadioButton1.Checked = true;
else
RadioButton2.Checked = true;
通过测试和分析,我们找到了问题的原因,由于忽视了页面处理流程中生命周期事件的处理顺序,导致代码设计上的漏洞。对按钮事件代码做了一点修改,测试结果能正确显示数据库查询信息了。
2 页面生命周期各个阶段的处理步骤
ASP.NET页面是Web应用程序的可编程用户接口, 当ASPX页面被客户端请求时,页面的服务器端代码被执行,执行结果被送回到浏览器端;当页面提交时,Form表单的action属性默认为本提交页面,HTTP协议是一个无状态协议,在服务器端重建页面时,如何保证提交页面的所有视图状态信息(页面对象的属性和页面控件的属性)与重建页面的视图状态信息的之间的完整性呢?其实,不论页面是首次被请求,还是页面事件被提交到服务器后重建的页面,服务器在把结果页面送到浏览器前都会把当前页面的所有视图状态封装到一个隐藏的输入域VIEWSTATE中,和HTML输出流一起发送到客户端浏览中。因此,当页面被提交到服务器时,上传到服务器的信息包括当前Form表单中用户选择或输入的数据,隐藏的输入域中页面视图状态信息以及用户交互的事件信息。这三类信息被服务器接收后,会在页面生命周期中不同阶段触发不同的服务器端生命周期事件来处理这些信息,同时也实现了在不同的页面之间传递页面视图状态信息。页面生命周期包括以下几个重要阶段:
(1)页面初始化阶段:此阶段,通过依次执行的三个事件,页面自身以及页面中的控件被首次初始化。PreIntit事件是页面生命周期的进入点,依据请求页面的类型设置页面属性的值(包括IsCallBack、IsCrossPagePostback及IsPostback),实例化页面控件;Init 事件是以一种上下文相关的方法加载页面和控件部分状态,为控件集合中的每个控件设置命名容器和一个具体的ID;IntiComplete事件是只有页面才有的事件,表明初始化阶段结束,页面及控件的视图状态变更跟踪功能已被打开。
Page_Init事件事件只是在第一次载入页面时被调用,这之后每次重新载入页面首先触发的会是Page_Load事件。
(2)视图状态恢复阶段:本阶段仅在页面回发时才执行。如果页面是回发请求,则在LoadViewState事件中恢复VIEWSTATE隐藏字段内容,_VIEWSTATE隐藏字段保存着上一个请求结束时所有控件视图状态。通过控件ID为每个控件加载视图的状态,使页面视图状态恢复到上一次提交保留在服务器上的每个控件的状态信息。
(3)处理表单数据阶段:HTTP请求中包装的所有用户数据,即用