日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
ASP.NET中的ViewState本質(zhì)

大家都聽說過也用過ASP.NET中的ViewState本質(zhì),到底ViewState本質(zhì)上到底是什么東西?為什么ASP.NET中沒有他不行?下面就來談?wù)?。?!?/p>

創(chuàng)新互聯(lián)公司主要從事成都做網(wǎng)站、網(wǎng)站設(shè)計(jì)、網(wǎng)頁設(shè)計(jì)、企業(yè)做網(wǎng)站、公司建網(wǎng)站等業(yè)務(wù)。立足成都服務(wù)彭山,十載網(wǎng)站建設(shè)經(jīng)驗(yàn),價(jià)格優(yōu)惠、服務(wù)專業(yè),歡迎來電咨詢建站服務(wù):028-86922220

我們一般在開發(fā)面向?qū)ο蟪绦虻臅r(shí)候,我們都是用對(duì)象保存數(shù)據(jù)的,比如用對(duì)象的屬性,字段來保存對(duì)象的狀態(tài)。當(dāng)調(diào)用對(duì)象的方法時(shí),就可以改變對(duì)象的狀態(tài)。釋放對(duì)象后,對(duì)象的狀態(tài)就消失。這點(diǎn)大家都熟悉。在開發(fā)桌面程序的時(shí)候,沒有什么問題,因?yàn)閷?duì)象都一般在本地的內(nèi)存中,直到不再用那個(gè)對(duì)象,我們就銷毀它。

但是在Web程序中,問題就大了,比如我們請(qǐng)求一個(gè)頁面的時(shí)候,我們希望把上一個(gè)頁面的狀態(tài)保存下來,因?yàn)橄乱粋€(gè)頁面要用到上一個(gè)頁面的狀態(tài),常見的例子就是填寫用戶信息時(shí),我們要把這次的信息和上一個(gè)頁面中的信息的比較,如果信息不同,就進(jìn)行一定的操作,等等。但是一旦頁面交給服務(wù)器后,上次的頁面的狀態(tài)信息就丟失了(HTTP協(xié)議是無狀態(tài)的)。

所以ASP.NET視圖機(jī)制就可以在請(qǐng)求結(jié)束時(shí)保存對(duì)象的狀態(tài),同時(shí)在下一個(gè)對(duì)象請(qǐng)求開始時(shí)加載之前的狀態(tài),下一個(gè)請(qǐng)求按照下面的步驟來加載狀態(tài):

1.創(chuàng)建一個(gè)與上一個(gè)請(qǐng)求結(jié)束時(shí)所注銷對(duì)象相同類型的新對(duì)象。比如,我們第一次請(qǐng)求的是Default.aspx頁面,在服務(wù)器端,ASP.NET運(yùn)行時(shí)就會(huì)編譯Default.aspx頁面,經(jīng)過一系列的動(dòng)作之后,在服務(wù)器端就有一個(gè)Default_aspx類的實(shí)例,然后再經(jīng)過一系列的動(dòng)作之后,就把我們請(qǐng)求的Default.aspx頁面的數(shù)據(jù)最后以html的形式發(fā)送了到我們的瀏覽器中。
 
此時(shí)服務(wù)器的Default_aspx的實(shí)例就銷毀了,對(duì)象就沒有了。當(dāng)我們?cè)贋g覽器中填寫了相關(guān)的信息后,再次請(qǐng)求提交Default.aspx頁面時(shí),服務(wù)器又會(huì)重新編譯Default.aspx 頁面,在然后經(jīng)過一系列的動(dòng)作后處理我們的數(shù)據(jù)。再次把處理的結(jié)果發(fā)送給我們,然后Default_Aspx實(shí)例再次銷毀了。

假如我們第三次還是請(qǐng)求的Default.aspx頁面,我們把數(shù)據(jù)再次提交,然而這次Default__aspx的實(shí)例就只是處理我們這次提交的數(shù)據(jù),不會(huì)管我們之前提交的數(shù)據(jù)。說的更加的通俗就是,我們第二次提交的數(shù)據(jù)是A,我們第三次提交的數(shù)據(jù)是B,而且我們本次希望頁面把A和B數(shù)據(jù)比較之后再發(fā)送 C數(shù)據(jù)給我們的,但是本次的處理頁面只是直到本次的提交的數(shù)據(jù),即B。所以我們永遠(yuǎn)得不到C的結(jié)果。

2.為新建的對(duì)象加載舊對(duì)象的狀態(tài)。

只有這樣我們才可以得到我們想要的數(shù)據(jù)C。我們來進(jìn)一步看看內(nèi)部機(jī)制。在每個(gè)請(qǐng)求結(jié)束時(shí)(簡(jiǎn)單的就可以認(rèn)為在服務(wù)器把數(shù)據(jù)發(fā)送給我們之前,此時(shí)數(shù)據(jù)還在服務(wù)器),就會(huì)引發(fā)一些事件,調(diào)用一些方法:

◆頁面自動(dòng)調(diào)用Controls集合中控件的SaveViewState方法,也就是迭代頁面中所有控件,調(diào)用他們的SaveViewState方法,因?yàn)榭丶际荂ontrol的子類,而Control類中有這個(gè)方法。

◆每個(gè)控件的SaveViewState方法把控件的狀態(tài)存儲(chǔ)到一個(gè)對(duì)象中。

◆頁面獲取每個(gè)控件的返回的那個(gè)保存狀態(tài)的對(duì)象,然后用與對(duì)象有關(guān)的轉(zhuǎn)換器把保存的狀態(tài)的對(duì)象轉(zhuǎn)換為字符串,然后把這些字符串表達(dá)式組合起來保存在一個(gè)隱藏字段中,隱藏字段名為:_VIEWSTATE.如下:

 
 
 
  1.  type=”hidden” name=”__VIEWSTATE” id=”__VIEWSTATE” value=”/wEPDwULLTE3MDU5MjY
  2. 4MTkPZBYCAgMPZBYCAgEPFCsAAmRkFgZmD2QWAmYPDxYCHgRUZXh0BQ5QYXltZW50IE1ldGhvZGRkAgEPZB
  3. YCZg8PDxYCHgtfIURhdGFCb3VuZGdkZGQCBw9kFgRmDw8PFgIfAWdkZGQCAg8PDxYCHwFnZGRkZJDAqbyjC
  4. j4rjagRWSiVYTp7nQfM” />

◆然后_VIEWSTATE隱藏字段就發(fā)送到了客戶端,和頁面數(shù)據(jù)一起。

◆當(dāng)頁面回傳到服務(wù)器,就發(fā)生下面的操作:

頁面字符串從_VIEWSTATE中得到字符串表達(dá)式。

頁面礦建解析字符串表達(dá)式

頁面框架使用與對(duì)象相關(guān)的類型轉(zhuǎn)換器,根據(jù)字符串表達(dá)式重新創(chuàng)建狀態(tài)對(duì)象。

頁面框架調(diào)用Controls集合中每個(gè)對(duì)象的LoadViewState方法加載之前的狀態(tài)
 
然后進(jìn)行其他的處理。

就這樣,ASP.NET就在請(qǐng)求之間保存了狀態(tài)。

總結(jié):以上就是ViewState本質(zhì)介紹,大家可以這么認(rèn)為:服務(wù)器端把頁面中對(duì)象的狀態(tài)序列化到客戶端,然后下面再反序列化得到之前的狀態(tài)。


文章名稱:ASP.NET中的ViewState本質(zhì)
鏈接地址:http://m.5511xx.com/article/cdcdcii.html