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

來源:互聯網
上載者:User

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

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

 

系列文章連結:

淺談ASP.NET的內部機制(一)

淺談ASP.NET的內部機制(二)

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

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

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

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

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

淺談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.如下:     

 

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

 

     2.4然後_VIEWSTATE隱藏欄位就發送到了用戶端,和頁面資料一起。

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

     頁面字串從_VIEWSTATE中得到字串運算式。

     頁面礦建解析字串運算式

     頁面架構使用與對象相關的類型轉換器,根據字串運算式重新建立狀態物件。

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

     然後進行其他的處理。

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

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

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

     

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.