|
如果你具有使用 Active Server Pages (ASP) 的經(jīng)驗(yàn),你將認(rèn)識(shí)到 ASP 是線性處理模型。ASP 頁(yè)是按從上到下的順序處理的。ASP 代碼和靜態(tài) HTML 的每一行都按其在文件中的顯示順序進(jìn)行處理。在往返行程中用戶操作導(dǎo)致頁(yè)被發(fā)送到服務(wù)器。因?yàn)榇瞬僮鲗?dǎo)致往返行程,所以服務(wù)器必須重新創(chuàng)建該頁(yè)。在重新創(chuàng)建該頁(yè)后,將通過(guò)與以前相同的從上到下的順序?qū)υ擁?yè)進(jìn)行處理,因此,該頁(yè)未表現(xiàn)出真正的事件驅(qū)動(dòng)行為。若要?jiǎng)?chuàng)建事件驅(qū)動(dòng)體驗(yàn),你需要顯式設(shè)計(jì)它。此外,你必須在最基本的級(jí)別上顯式維護(hù)頁(yè)和控件狀態(tài)。此模型限制了可以組合的用戶界面的豐富程度,并且此模型增加了需要支持它的代碼的復(fù)雜性。
與此相比,傳統(tǒng) Visual Basic 應(yīng)用程序中的事件驅(qū)動(dòng)模型包含可編程的元素,這些元素可被初始化并在窗體上顯示。用戶與這些元素進(jìn)行交互,而這又導(dǎo)致引發(fā)調(diào)用事件處理程序的事件。此模型支持真正的事件驅(qū)動(dòng)行為,這在設(shè)計(jì)上極大拓寬了可以組合的用戶界面的豐富程度,并且降低了需要支持它的代碼的復(fù)雜性。 ASP.NET 通過(guò)模擬事件驅(qū)動(dòng)模型的行為代替了 ASP 的線性處理模型。提供 ASP.NET 頁(yè)框架以隱式地為你建立事件和事件處理程序的關(guān)聯(lián)。利用該頁(yè)框架,你可以很容易地創(chuàng)建響應(yīng)用戶操作的用戶界面。 首先,我們必須先了解一下Web窗體的生命周期,才能更好的了解Web窗體的狀態(tài)管理。 一個(gè)Web窗體的生命周期類似于在服務(wù)器中運(yùn)行的Web進(jìn)程的生命周期。一個(gè)Web窗體從實(shí)例化分配內(nèi)存空間到處理結(jié)束釋放內(nèi)存,一般經(jīng)歷下面4個(gè)步驟:初始化、頁(yè)面裝載、事件處理和資源清理。 ?。?)頁(yè)面初始化 當(dāng)頁(yè)面被初始化時(shí),發(fā)生第一個(gè)事件Page_Init。系統(tǒng)會(huì)執(zhí)行創(chuàng)建和設(shè)置一個(gè)例示所需要的所有初始化步驟。 ?。?)頁(yè)面裝載 頁(yè)面裝載在初始化之后,所發(fā)生的事件叫做 Page_Load,它的用途如下: 根據(jù) Page.IsPostBack 屬性檢查頁(yè)面是不是第一次被處理; 第一次處理頁(yè)面時(shí)執(zhí)行數(shù)據(jù)捆綁,或者在以后的循環(huán)過(guò)程中重新判斷數(shù)據(jù)捆綁表達(dá)式; 讀取和更新控件屬性; 恢復(fù)在保存步驟中所保存的前一個(gè)客戶請(qǐng)求的狀態(tài); ?。?)事件處理 Web窗體上的每個(gè)動(dòng)作都激活一個(gè)到達(dá)服務(wù)器的事件。一個(gè)Web窗體有兩個(gè)視圖:一個(gè)客戶視圖和一個(gè)服務(wù)器視圖。所有的數(shù)據(jù)處理都在服務(wù)器上進(jìn)行。當(dāng)通過(guò)點(diǎn)擊鼠標(biāo)或其它方法引起一個(gè)事件時(shí),事件就到達(dá)服務(wù)器并返回相應(yīng)的數(shù)據(jù)。 ?。?)資源清理 最后一步發(fā)生于一個(gè)窗體完成了它的任務(wù)并且準(zhǔn)備卸載的時(shí)候,這時(shí)激活Page_Unload事件,完成最后的資源清理工作,比如:關(guān)閉文件,關(guān)閉數(shù)據(jù)庫(kù)連接,丟棄對(duì)象。 我們知道基于Web的訪問(wèn)方式是斷開式的,Web頁(yè)面是無(wú)狀態(tài)性的。而于ASP中的線性驅(qū)動(dòng)方式不同的是ASP.NET采用的是事件驅(qū)動(dòng)模式,那么 ,Web窗體是怎么樣做到ASP.NET頁(yè)面狀態(tài)的維護(hù)的呢?在ASP.NET中引入了一個(gè)概念:View State,從而用View State來(lái)保存頁(yè)面的狀態(tài)信息。 除了第一次的訪問(wèn)請(qǐng)求是有基類生成以外,以后每次客戶端的回傳都是根據(jù)客戶端傳來(lái)的頁(yè)面狀態(tài)來(lái)重新創(chuàng)建頁(yè)面。而頁(yè)面的各個(gè)狀態(tài)信息就保存在客戶端頁(yè)面源文件的隱藏字段<input type="hidden" name="__VIEWSTATE" value=""/>中,我們可以通過(guò)瀏覽器查看到它,value的值就是經(jīng)過(guò)加密的頁(yè)面狀態(tài)信息。服務(wù)器根據(jù)value值進(jìn)行窗體的再現(xiàn),然后在窗體的事件處理階段進(jìn)行執(zhí)行響應(yīng)的事件過(guò)程,然后把執(zhí)行結(jié)果返回到客戶端,并且改變Web窗體的狀態(tài)值,并回寫到value值中。最后到達(dá)資源清理階段。整個(gè)過(guò)程就是一個(gè)Web窗體的生命周期,同時(shí)也完成了頁(yè)面狀態(tài)的管理。 下面這個(gè)實(shí)例演示了ASP.NET頁(yè)面框架是如何維護(hù)頁(yè)面狀態(tài)的。所有代碼如下: <%@ Page Language="VB" %> 保存為viewstate.aspx,運(yùn)行結(jié)果如圖4.9所示。
在客戶端的瀏覽器中,我們查看源文件,可以查看到的隱藏字段的值為: 作者:李宗民 來(lái)源:IT168 (責(zé)任編輯:webjx)
|
|
|