自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

淺析ASP.NET禁用ViewState

開發(fā) 后端
本文介紹ASP.NET禁用ViewState,以及介紹目標(biāo)應(yīng)用環(huán)境、頁(yè)面的性質(zhì)和對(duì)ViewState和頁(yè)面事件的理解程度等。

前段時(shí)間由于程序出現(xiàn)了比較大的性能問題,視圖(View)之間的跳轉(zhuǎn)速度非常慢。通過Fiddler調(diào)試和分析,查找到是由于在視圖(View) 轉(zhuǎn)換(PostBack)過程中,客戶端給服務(wù)器端的發(fā)送字節(jié)數(shù)非常大,一般在30K以上,就相當(dāng)于客戶端每次都要給服務(wù)器上傳大十K的數(shù)據(jù)量,這如果是比較好的網(wǎng)絡(luò)環(huán)境下完全是可以忽略的,但是目前的網(wǎng)絡(luò)環(huán)境確實(shí)還達(dá)不到這樣的要求。詳細(xì)請(qǐng)看《無刷新視圖跳轉(zhuǎn)的局限性》。針對(duì)這一情況,我的解決方案就是禁用頁(yè)面的ViewState,只有這樣才是最根本的解決辦法。原本還想寫一篇blog來好好批一下ViewState,當(dāng)初想好的標(biāo)題是“ASP.NET程序的性能殺手----ViewState”?,F(xiàn)在看來,還好沒寫,要不還不被人批是“沒有真正會(huì)用 ASP.NET 的人”?(盡管確實(shí)還沒有真正全面認(rèn)識(shí)ASP.NET)。

在jillzhang的blog《給頁(yè)面減減肥!》中給頁(yè)面減肥的辦法是對(duì)頁(yè)面進(jìn)行壓縮。這確實(shí)是一種辦法,特別是當(dāng)在硬件環(huán)境允許的條件下,可以帶來非常大的好處,一般體積都可以減小好幾倍。減小頁(yè)面體積還有一種辦法,那就是ASP.NET禁用ViewState,兩種方法并不是互斥的,而且我認(rèn)為只有禁用ViewState后,頁(yè)面壓縮的效果才更明顯的。因?yàn)閂iewState的值本身就是一些相對(duì)緊湊的字符,而HTML代碼則相對(duì)松散,(我也不是特別肯定這對(duì)壓縮有必然的聯(lián)系。)。最近一直在從事頁(yè)面速度的優(yōu)化方面的工作,所以很多平常不注意的細(xì)節(jié),它所造成的性能影響在這時(shí)候就體現(xiàn)出來了。一般的頁(yè)面(服務(wù)器控件比較多)如果ASP.NET禁用ViewState后,它的體積至少會(huì)減小一半。而且這一半的數(shù)據(jù)在很多情況都是沒用的(特別是在不需要PostBack的情況下,簡(jiǎn)直就是累贅),如果這時(shí)候再加HTML壓縮的話,那壓縮比就不止3-5倍了。有一個(gè)頁(yè)面正常的大?。ˋSP.NET禁用ViewState后)是101,730 byte ,壓縮后變成了11,182 byte。說實(shí)話我也很驚訝這樣的壓縮比。通過這里可以看這組驚人數(shù)據(jù)。

那這一切是不是都是ASP.NET的錯(cuò)呢?ViewState是不是就是“萬(wàn)惡之源”呢?是,也不是。為什么呢?首先我們要正確認(rèn)識(shí)ViewState存在的意義,更多的情況下MS是為我們這些新手快速入門而考慮的。正因?yàn)橛辛薞iewState,讓我們開發(fā)B/S應(yīng)用程序能夠按照我們的正常的思維邏輯來進(jìn)行。而屏蔽了在PostBack時(shí),還要去初始化一堆的頁(yè)面控件,給這個(gè)控件還原我們提交的請(qǐng)求值等等,想想這對(duì)于我們來說是多少?gòu)?fù)雜而麻煩的一項(xiàng)工作啊!而不是像我們現(xiàn)在這樣,直接在PostBack事件取我們想要的控件的值這么簡(jiǎn)單。而默認(rèn)情況下ViewState=true,也是在為初學(xué)者著想的,不至于讓一個(gè)初學(xué)ASP.NET的同學(xué)在寫postback事件時(shí)出現(xiàn)一些奇怪的錯(cuò)誤而灰心喪氣,提高門坎。一段個(gè)人的理解可能還不能讓一些朋友看得很明白,關(guān)于ViewState的討論已經(jīng)很多了,但是最重要一點(diǎn)就是理解頁(yè)面的執(zhí)行生命周期。如果把下面這張圖啃下去后你也許就會(huì)有深刻理解了。

 


談點(diǎn)有意義的吧?是禁還是用?決定因素有以下幾點(diǎn)(個(gè)人理解):

1.你的目標(biāo)應(yīng)用環(huán)境。

這是最根本的,如果你的ASP.NET應(yīng)用程序只在局域網(wǎng)(Intertrant)內(nèi)應(yīng)用的話,那非常棒,我們完全可以忽略ViewState存在的影響。

2.頁(yè)面的性質(zhì)。

如果你的頁(yè)面是一種信息瀏覽的性質(zhì),而完全沒有PostBack事件的話。這里的ViewState就完全是可以被消滅的。反之,如果頁(yè)面中有PostBack事件,盡管只有一個(gè),那你如果禁用了ViewState,都有可能產(chǎn)生不可預(yù)期的錯(cuò)誤。

3.你對(duì)ViewState和頁(yè)面事件的理解程度。

如果你很理解頁(yè)面的生命周期和執(zhí)行過程,那你完全可以根據(jù)需要來設(shè)置哪些控件需要打開ViewState,哪些控件可以禁用ViewState,做到按需使用,合理使用ViewState。達(dá)到性能的最優(yōu)化。

4.開發(fā)人員的勤勞程度和外在因素。

如果你很勤勞,而且你也了解了ViewState的原理,你可以按需使用。但是如果你很懶,而且很多外在因素(團(tuán)隊(duì)其它成員的理解程度)你沒無法控制的話,那就直接禁用頁(yè)面的ViewState好了。當(dāng)然前提是你必須知道如果去正確處理禁用ViewState后遺留下的問題,這些問題一般都是一些讓人難以捉摸的東西。如果你都是一一的解決了這些問題的話,那對(duì)ViewState的感情就更深了。呵呵。

可以這么說ViewState是頁(yè)面控件狀態(tài)的一個(gè)副本,比如一個(gè)DropDownList控件,它在ASP.NET頁(yè)面上要是以select HTML tag 來展現(xiàn)的,而這時(shí)在ViewState中還保存著它所有Item的副本。當(dāng)我們?cè)趐ostback的時(shí)候?yàn)槭裁茨軌蛉〉街的??就是因?yàn)閂iewState,它會(huì)在ProcessPostData(before Load)之前將這個(gè)副本還原成了DropDownList的Item了。然后在ProcessPostData方法中將表單提交的選擇項(xiàng)設(shè)置為 DropDownList的SelectedValue。以前這一過程我們無需參與。而當(dāng)ASP.NET禁用ViewState后,我們就要手動(dòng)去維護(hù)DropDownList回發(fā)情況下的Item初始化,利用Request.Params(或Request.Form)取得SelectedValue值等等,而這些工作有可能就要在Page_Load事件之前做了。

【編輯推薦】

  1. 微軟發(fā)布ASP.NET MVC 2預(yù)覽版 多項(xiàng)功能更新
  2. ASP.NET服務(wù)器自定義控件安全準(zhǔn)則
  3. ASP.NET編程規(guī)范之編碼規(guī)范淺析
  4. 關(guān)于ASP.NET Session的一點(diǎn)認(rèn)識(shí)
  5. ASP.NET編程工具ASP.NET Web Matrix詳細(xì)介紹
責(zé)任編輯:佚名 來源: IT168
相關(guān)推薦

2009-08-05 15:01:04

ASP.NET應(yīng)用Vi

2009-07-28 13:39:44

加載ViewStateASP.NET

2009-07-28 16:42:02

ViewState技術(shù)ASP.NET應(yīng)用

2009-08-04 12:29:57

ViewState概念ASP.NET

2009-08-04 17:20:37

PostBack和ViASP.NET

2009-07-20 15:19:52

ViewState本質(zhì)ASP.NET

2009-07-31 12:43:59

ASP.NET MVC

2009-08-05 15:50:13

ASP.NET優(yōu)點(diǎn)

2009-07-24 13:41:15

ASP.NET AJA

2009-08-05 18:36:12

ASP.NET Che

2009-08-10 13:32:15

ASP.NET TimASP.NET組件設(shè)計(jì)

2009-07-20 16:23:01

ASP.NET授權(quán)模塊

2009-07-23 14:31:20

ASP.NET MVC

2009-07-28 16:40:11

ASP.NET異步頁(yè)面

2009-07-28 15:53:43

ASP.NET Web

2009-07-27 10:18:12

TypeResolveASP.NET

2009-08-05 14:46:17

ASP.NET url

2009-07-28 13:35:18

2009-08-04 17:16:16

ASP.NET代碼優(yōu)化

2009-08-05 16:50:09

ASP.NET For
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)