asp.net|web 如果你具有使用 Active Server Pages (ASP) 的經驗,你將認識到 ASP 是線性處理模型。ASP 頁是按從上到下的順序處理的。ASP 代碼和靜態 HTML 的每一行都按其在檔案中的顯示順序進行處理。在往返行程中使用者操作導致頁被發送到伺服器。因為此操作導致往返行程,所以伺服器必須重新建立該頁。在重新建立該頁後,將通過與以前相同的從上到下的順序對該頁進行處理,因此,該頁未表現出真正的事件驅動行為。若要建立事件驅動體驗,你需要顯式設計它。此外,你必須在最基本的層級上顯式維護頁和控制項狀態。此模型限制了可以組合的使用者介面的豐富程度,並且此模型增加了需要支援它的代碼的複雜性。
與此相比,傳統 Visual Basic 應用程式中的事件驅動模型包含可程式化的元素,這些元素可被初始化並在表單上顯示。使用者與這些元素進行互動,而這又導致引發呼叫事件處理常式的事件。此模型支援真正的事件驅動行為,這在設計上極大拓寬了可以組合的使用者介面的豐富程度,並且降低了需要支援它的代碼的複雜性。
ASP.NET 通過類比事件驅動模型的行為代替了 ASP 的線性處理模型。提供 ASP.NET 頁架構以隱式地為你建立事件和事件處理常式的關聯。利用該頁架構,你可以很容易地建立響應使用者操作的使用者介面。
首先,我們必須先瞭解一下Web表單的生命週期,才能更好的瞭解Web表單的狀態管理。
一個Web表單的生命週期類似於在伺服器中啟動並執行Web進程的生命週期。一個Web表單從執行個體化分配記憶體空間到處理結束釋放記憶體,一般經曆下面4個步驟:初始化、頁面裝載、事件處理和資源清理。
(1)頁面初始化
當頁面被初始化時,發生第一個事件Page_Init。系統會執行建立和設定一個例示所需要的所有初始化步驟。
(2)頁面裝載
頁面裝載在初始化之後,所發生的事件叫做 Page_Load,它的用途如下:
根據 Page.IsPostBack 屬性檢查頁面是不是第一次被處理;
第一次處理頁面時執行資料捆綁,或者在以後的迴圈過程中重新判斷資料捆綁運算式;
讀取和更新控制項屬性;
恢複在儲存步驟中所儲存的前一個客戶請求的狀態;
(3)事件處理
Web表單上的每個動作都啟用一個到達伺服器的事件。一個Web表單有兩個視圖:一個客戶視圖和一個伺服器視圖。所有的資料處理都在伺服器上進行。當通過點擊滑鼠或其它方法引起一個事件時,事件就到達伺服器並返回相應的資料。
(4)資源清理
最後一步發生於一個表單完成了它的任務並且準備卸載的時候,這時啟用Page_Unload事件,完成最後的資源清理工作,比如:關閉檔案,關閉資料庫連接,丟棄對象。
我們知道基於Web的訪問方式是斷開式的,Web頁面是無狀態性的。而於ASP中的線性驅動方式不同的是ASP.NET採用的是事件驅動模式,那麼 ,Web表單是怎麼樣做到ASP.NET頁面狀態的維護的呢?在ASP.NET中引入了一個概念:View State,從而用View State來儲存頁面的狀態資訊。
除了第一次的訪問請求是有基類產生以外,以後每次用戶端的回傳都是根據用戶端傳來的頁面狀態來重新建立頁面。而頁面的各個狀態資訊就儲存在用戶端頁面源檔案的隱藏欄位<input type="hidden" name="__VIEWSTATE" value=""/>中,我們可以通過瀏覽器查看到它,value的值就是經過加密的頁面狀態資訊。伺服器根據value值進行表單的再現,然後在表單的事件處理階段進行執行響應的事件程序,然後把執行結果返回到用戶端,並且改變Web表單的狀態值,並回寫到value值中。最後到達資源清理階段。整個過程就是一個Web表單的生命週期,同時也完成了頁面狀態的管理。
下面這個執行個體示範了ASP.NET頁面架構是如何維護頁面狀態的。所有代碼如下:
<%@ Page Language="VB" %>
<script runat="server">
Sub Button1_Click(sender As Object, e As EventArgs)
'使viewstate(“value”)的值增1
viewstate("value") += 1
Label1.Text = "這是第" & Str(viewstate("value")) & "點擊按鈕"
End Sub
sub page_Load(sender As Object, e As EventArgs)
'判斷是否為第一次處理該頁面
'如果是則使viewstate類儲存鍵value的值為0
If Not Page.IsPostBack Then
viewstate("value") = 0
Label1.Text = "這是第" & Str(viewstate("value")) & "點擊按鈕"
End If
end sub
</script>
<html>
<head>
<title>頁面狀態管理</title>
</head>
<body ms_positioning="GridLayout">
<form id="Form1" method="post" runat="server">
<asp:Label id="Label1" runat="server" width="176px"></asp:Label>
<br />
<asp:Button id="Button1" runat="server" Text="點擊累加"></asp:Button>
</form>
</body>
</html>
儲存為viewstate.aspx,運行結果如圖4.9所示。
圖4.9 點擊3次按鈕之後
在用戶端的瀏覽器中,我們查看源檔案,可以查看到的隱藏欄位的值為:
<input type="hidden" name="__VIEWSTATE" value="dDwtOTk1MjE0NDA4O3Q8cDxsPHZhbHVlOz47bDxpPDM+Oz4+O2w8aTwxP
js+O2w8dDw7bDxpPDE+Oz47bDx0PHA8cDxsPFRleHQ7PjtsPOi/meaYr+esrCAz54K5
5Ye75oyJ6ZKuOz4+Oz47Oz47Pj47Pj47PmLc5pTevWJok9DSup0E5RUygUMi" />
而整個頁面的狀態資訊就其中