在asp.net開發的應用程序中,當某個頁面被請求時,它的類及其所包含的服務器控件會負責處理請求,呈現HTML輸出,並隨後發回客戶端.由於HTTP協議的固有特性,客戶端與服務器間的通信是無狀態且非連接的.而實際的應用程序需要狀態,以便維護同一頁面的後續調用.使用asp或其他服務器端開發平臺(如jsp,php),程序員必須負責狀態的存儲和恢復.儘管基於無狀態的協議,但以這種方式,從客戶端體驗到的是連續的執行過程,然而,這只是一種表象.
連續性所導致的這種現象,一方面與頁面的設計和工作方式有關,另一方面是asp.net頁面視圖狀態造成的.與此同時,服務器端控件也發揮着重要作用.簡而言之,在頁面將其內容呈現爲html之前,頁面要將自身及其所包含的控件的狀態信息存儲在持久性介質(通常是隱藏字段)中.當頁面回發後,其狀態會從隱藏字段中被反序列化,用於對申明在頁面佈局中的服務器控件實例進行初始化.
每個頁面實例有其特有的視圖狀態,因爲該信息嵌入在html中,這樣做的好處是,控件會以上一次創建的視圖狀態(即該頁最後一次被呈現發送到客戶端時的狀態)的值進行初始化.此外,頁面週期中還會有一個階段,將以存儲的狀態與由客戶端做出的更新合併.在回發後,頁面執行時,它會發現一個有狀態的且更新過的上下文,就像工作在連續的對點連接上一樣.
這裏做了兩個假設,第一個假設是,頁面總是投遞給自身,並攜帶着狀態信息.第二個假設是,服務器端控件必須帶有runat=server屬性,以便在頁面回發後具有"生命力".