王雅新
【摘 要】Web頁面是asp.net應(yīng)用程序的重要組成部分,理解頁面生命周期中執(zhí)行的一系列步驟對軟件代碼的設(shè)計和優(yōu)化非常重要。文章通過對單選按鈕功能調(diào)試的案例剖析,分析和演示了Web頁面處理過程中幾個重要的生命周期階段對頁面交互數(shù)據(jù)的影響以及相關(guān)的代碼處理。
【關(guān)鍵詞】案例;頁面生命周期
中圖分類號: TP393.092 文獻(xiàn)標(biāo)識碼: 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 案例調(diào)試中的排錯處理
在一個用于教學(xué)的軟件系統(tǒng)的設(shè)計中,要完成一個從數(shù)據(jù)庫中獲取信息并在頁面中顯示的功能。在Web頁面設(shè)計中,性別數(shù)據(jù)使用了兩個單選按鈕控件RadioButton,其他數(shù)據(jù)都用TextBox控件顯示。數(shù)據(jù)庫信息的檢索和顯示是通過按鈕的事件來處理的,頁面結(jié)構(gòu)如下圖所示:
圖1
從圖中可以看出,當(dāng)在學(xué)號文本框中輸入學(xué)號信息,點擊提交按鈕后,數(shù)據(jù)庫中的查詢結(jié)果信息就應(yīng)該正確顯示出來了。但是,在實際調(diào)試運行中,查詢結(jié)果中性別信息的顯示令人迷茫,我用了三個學(xué)號測試數(shù)據(jù),對應(yīng)的數(shù)據(jù)庫中的性別字段值分別是“男,女,男”,第一次輸入關(guān)鍵字,提交查詢,頁面能夠正確顯示數(shù)據(jù)庫中的數(shù)據(jù)信息;然后,修改查詢關(guān)鍵字,再次提交,頁面也能夠正確顯示查詢結(jié)果;再輸入第三個學(xué)號信息,提交后,單選按鈕顯示的是“女”被選中,除了單選按鈕信息不正確外,其他信息都正確顯示。換一組學(xué)號測試數(shù)據(jù),對應(yīng)的數(shù)據(jù)庫中的性別字段值分別是“女,男”,結(jié)果顯示,第一次提交查詢,能夠正確顯示數(shù)據(jù)庫信息,但是,第二次輸入對應(yīng)性別為“男”的學(xué)號信息時,查詢結(jié)果顯示的還是“女”單選按鈕選中的狀態(tài),除了性別信息顯示不正確外,其他數(shù)據(jù)庫信息顯示都正確。在按鈕事件代碼中,依據(jù)數(shù)據(jù)庫的查詢結(jié)果設(shè)置單選按鈕的代碼如下:
if (dr.GetBoolean(2) == true)
RadioButton1.Checked = true;
else
RadioButton2.Checked = true;
通過測試和分析,我們找到了問題的原因,由于忽視了頁面處理流程中生命周期事件的處理順序,導(dǎo)致代碼設(shè)計上的漏洞。對按鈕事件代碼做了一點修改,測試結(jié)果能正確顯示數(shù)據(jù)庫查詢信息了。
2 頁面生命周期各個階段的處理步驟
ASP.NET頁面是Web應(yīng)用程序的可編程用戶接口, 當(dāng)ASPX頁面被客戶端請求時,頁面的服務(wù)器端代碼被執(zhí)行,執(zhí)行結(jié)果被送回到瀏覽器端;當(dāng)頁面提交時,F(xiàn)orm表單的action屬性默認(rèn)為本提交頁面,HTTP協(xié)議是一個無狀態(tài)協(xié)議,在服務(wù)器端重建頁面時,如何保證提交頁面的所有視圖狀態(tài)信息(頁面對象的屬性和頁面控件的屬性)與重建頁面的視圖狀態(tài)信息的之間的完整性呢?其實,不論頁面是首次被請求,還是頁面事件被提交到服務(wù)器后重建的頁面,服務(wù)器在把結(jié)果頁面送到瀏覽器前都會把當(dāng)前頁面的所有視圖狀態(tài)封裝到一個隱藏的輸入域VIEWSTATE中,和HTML輸出流一起發(fā)送到客戶端瀏覽中。因此,當(dāng)頁面被提交到服務(wù)器時,上傳到服務(wù)器的信息包括當(dāng)前Form表單中用戶選擇或輸入的數(shù)據(jù),隱藏的輸入域中頁面視圖狀態(tài)信息以及用戶交互的事件信息。這三類信息被服務(wù)器接收后,會在頁面生命周期中不同階段觸發(fā)不同的服務(wù)器端生命周期事件來處理這些信息,同時也實現(xiàn)了在不同的頁面之間傳遞頁面視圖狀態(tài)信息。頁面生命周期包括以下幾個重要階段:
(1)頁面初始化階段:此階段,通過依次執(zhí)行的三個事件,頁面自身以及頁面中的控件被首次初始化。PreIntit事件是頁面生命周期的進(jìn)入點,依據(jù)請求頁面的類型設(shè)置頁面屬性的值(包括IsCallBack、IsCrossPagePostback及IsPostback),實例化頁面控件;Init 事件是以一種上下文相關(guān)的方法加載頁面和控件部分狀態(tài),為控件集合中的每個控件設(shè)置命名容器和一個具體的ID;IntiComplete事件是只有頁面才有的事件,表明初始化階段結(jié)束,頁面及控件的視圖狀態(tài)變更跟蹤功能已被打開。
Page_Init事件事件只是在第一次載入頁面時被調(diào)用,這之后每次重新載入頁面首先觸發(fā)的會是Page_Load事件。
(2)視圖狀態(tài)恢復(fù)階段:本階段僅在頁面回發(fā)時才執(zhí)行。如果頁面是回發(fā)請求,則在LoadViewState事件中恢復(fù)VIEWSTATE隱藏字段內(nèi)容,_VIEWSTATE隱藏字段保存著上一個請求結(jié)束時所有控件視圖狀態(tài)。通過控件ID為每個控件加載視圖的狀態(tài),使頁面視圖狀態(tài)恢復(fù)到上一次提交保留在服務(wù)器上的每個控件的狀態(tài)信息。
(3)處理表單數(shù)據(jù)階段:HTTP請求中包裝的所有用戶數(shù)據(jù),即用