程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> ASP.NET >> 關於ASP.NET >> 淺談ASP.NET內部機制(六)

淺談ASP.NET內部機制(六)

編輯:關於ASP.NET

前言:大家都聽說過也用過ASP.NET中的視圖ViewState,到底ViewState本質上到底是什麼東西?為什 麼ASP.NET中沒有他不行?下面就來談談。。。

我們一般在開發面向對象程序的時候,我們都是用對象保存數據的,比如用對象的屬性,字段來保存 對象的狀態。當調用對象的方法時,就可以改變對象的狀態。釋放對象後,對象的狀態就消失。這點大家 都熟悉。在開發桌面程序的時候,沒有什麼問題,以為對象都一般在本地的內存中,直到不再用那個對象 ,我們就銷毀它。但是在Web程序中,問題就大了,比如我們請求一個頁面的時候,我們希望把上一個頁 面的狀態保存下來,因為下一個頁面要用到上一個頁面的狀態,常見的例子就是填寫用戶信息時,我們要 把這次的信息和上一個頁面中的信息的比較,如果信息不同,就進行一定的操作,等等。但是一旦頁面交 給服務器後,上次的頁面的狀態信息就丟失了(HTTP協議是無狀態的)。

所以ASP.NET視圖機制就可以在請求結束時保存對象的狀態,同時在下一個對象請求開始時加載之前的 狀態,下一個請求按照下面的步驟來加載狀態:

1、創建一個與上一個請求結束時所注銷對象相同類型的新對象。比如,我們第一次請求的是 Default.aspx頁面,在服務器端,ASP.NET運行時就會編譯Default.aspx頁面,經過一系列的動作之後, 在服務器端就有一個Default_aspx類的實例,然後再經過一系列的動作之後,就把我們請求的 Default.aspx頁面的數據最後以html的形式發送了到我們的浏覽器中。此時服務器的Default_aspx的實例 就銷毀了,對象就沒有了。當我們再浏覽器中填寫了相關的信息後,再次請求提交Default.aspx頁面時, 服務器又會重新編譯Default.aspx 頁面,在然後經過一系列的動作後處理我們的數據。再次把處理的結 果發送給我們,然後Default_Aspx實例再次銷毀了。

假如我們第三次還是請求的Default.aspx頁面,我們把數據再次提交,然而這次Default__aspx的實例 就只是處理我們這次提交的數據,不會管我們之前提交的數據。說的更加的通俗就是,我們第二次提交的 數據是A,我們第三次提交的數據是B,而且我們本市希望頁面把A和B數據比較之後再發送C數據給我們的 ,但是本次的處理頁面只是直到本次的提交的數據,即B。所以我們永遠得不到C的結果。

2.為新建的對象加載舊對象的狀態。

只有這樣我們才可以得到我們想要的數據C。我們來進一步看看內部機制。在每個請求結束時(簡單的 就可以認為在服務器把數據發送給我們之前,此時數據還在服務器),就會引發一些事件,調用一些方法 :

2.1頁面自動調用Controls集合中控件的SaveViewState方法,也就是迭代頁面中所有控件,調用他們 的SaveViewState方法,因為控件都是Control的子類,而Control類中有這個方法。

2.2每個控件的SaveViewState方法把控件的狀態存儲到一個對象中。

2.3頁面獲取每個控件的返回的那個保存狀態的對象,然後用與對象有關的轉換器把保存的狀態的對象 轉換為字符串,然後把這些字符串表達式組合起來保存在一個隱藏字段中,隱藏字段名為:_VIEWSTATE. 如下:    

<input type=”hidden” name=”__VIEWSTATE” id=”__VIEWSTATE” value=”/wEPDwULLTE3MDU5MjY
4MTkPZBYCAgMPZBYCAgEPFCsAAmRkFgZmD2QWAmYPDxYCHgRUZXh0BQ5QYXltZW50IE1ldGhvZGRkAgEPZB
YCZg8PDxYCHgtfIURhdGFCb3VuZGdkZGQCBw9kFgRmDw8PFgIfAWdkZGQCAg8PDxYCHwFnZGRkZJDAqbyjC
j4rjagRWSiVYTp7nQfM” />

2.4然後_VIEWSTATE隱藏字段就發送到了客戶端,和頁面數據一起。

2.5當頁面回傳到服務器,就發生下面的操作:

頁面字符串從_VIEWSTATE中得到字符串表達式。

頁面礦建解析字符串表達式

頁面框架使用與對象相關的類型轉換器,根據字符串表達式重新創建狀態對象。

頁面框架調用Controls集合中每個對象的LoadViewState方法加載之前的狀態

然後進行其他的處理。

就這樣,ASP.NET就在請求之間保存了狀態。

總結:大家可以這麼認為:服務器端把頁面中對象的狀態序列化到客戶端,然後下面再反序列化得到 之前的狀態。

下篇講解頁面的解析過程。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved