ApplicationState
應用程序狀態(tài)是指采用HttpApplicationState實現(xiàn)的狀態(tài)維持方式,使用代碼如下:
Application.Lock(); Application["PageRequestCount"] = ((int)Application["PageRequestCount"]) + 1; Application.UnLock();
對于這種方法,我不建議使用,因為:
1. 與使用靜態(tài)變量差不多,直接使用靜態(tài)變量可以不需要字典查找。
2. 選擇強類型的集合或者變量可以避免裝箱拆箱。
ViewState,ControlState
視圖狀態(tài),控件狀態(tài),二者是類似,在頁面中表現(xiàn)為一個hidden-input元素:
<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="......................" />
控件狀態(tài)是ASP.NET 2.0中引入,與視圖狀態(tài)相比,它不允許關閉。
由于它們使用方式一致,而且視圖狀態(tài)是基于控件狀態(tài)的實現(xiàn)邏輯,所以我就不區(qū)分它們了。
在ASP.NET的早期,微軟為了能幫助廣大開發(fā)人員提高開發(fā)效率,引用入一大批的服務端控件,并為了能將事件編程機制引入ASP.NET中,又發(fā)明了ViewState。
這種方式雖然可以簡化開發(fā)工作量,然而卻有一些限制和缺點:
1. 視圖狀態(tài)的數(shù)據(jù)只能用于回發(fā)(postback)。
2. 視圖狀態(tài)的【濫用】容易導致生成的HTML較大,這會引起一個惡性循環(huán):
a. 過大的ViewState在序列化過程中會消耗較多的服務器CPU資源,
b. 過大的ViewState最終生成的HTML輸出也會很大,它會浪費服務端網(wǎng)絡資源,
c. 過大的ViewState輸出導致表單在下次提交時,會占用客戶端網(wǎng)絡資源。
d. 過大的ViewState數(shù)據(jù)上傳到服務端后,反序列化又會消耗較多的服務器CPU資源。
因此,整個交互過程中,用戶一直在等待,用戶體驗極差。
在ASP.NET興起的年代,ViewState絕對是個了不起的發(fā)明。
然而,現(xiàn)在很多關于ASP.NET性能優(yōu)化的方法中,都會將【關閉ViewState】放在頭條位置。
為什么會這樣呢,大家可以自己思考一下了。
有些人認為:我現(xiàn)在做的程序只是在局域網(wǎng)內使用,使用ViewState完全沒有問題!
然而,那些人或許沒有想過:
1. 未來用戶可能會把它部署在互聯(lián)網(wǎng)上運行(對于產(chǎn)品來說就是遇到大客戶了)。
2. 項目早期的設計與規(guī)劃,對后期的開發(fā)與維護來說,影響是巨大的,因為許多基礎部分通常是在早期開發(fā)的。
當這二種情況的任何一種發(fā)生時,想再禁用ViewState,可能已經(jīng)晚了。
對于視圖狀態(tài),我認為它解決的問題比它引入的問題要多要復雜,
因此,我不想花時間整理它的優(yōu)缺點,我只想說一句:把它關了,在web.config中關了。
另外,我不排斥使用服務器控件,我認為:你可以使用服務端控件顯示數(shù)據(jù),但不要用它處理回發(fā)。
如果你仍然認為視圖狀態(tài)是不可缺少的,那我還是建議你看看ASP.NET MVC框架,看看沒有視圖狀態(tài)是不是照樣可以寫ASP.NET程序。
本文導航
- 第1頁: 首頁
- 第2頁: QueryString
- 第3頁: Cookie
- 第4頁: ApplicationState
- 第5頁: Session
- 第6頁: Profile
- 第7頁: 各種狀態(tài)管理對比