iT邦幫忙

DAY 3
6

ASP.NET 由淺入深系列 第 3

91之ASP.NET由淺入深 不負責講座 Day3 - ViewState

ASP.NET Webform透過PostBack與ViewState來解決無狀態的http問題,以及Event-Driven Model的基底。
所以得要瞭解到底ViewState是什麼,以及其相關的issues。
stateless http
何謂無狀態的http,http並不會幫你記住任何事情,網頁的呈現,就是從server端下載一份document,然後在client的browser上呈現。在不同document之間,http並不會記住任何東西

ViewState的目的
ViewState對於client的網頁來說,完全用不到。ViewState的目的,是為了在postback之間記住上次的值。

Why ViewState
因為http stateless,而ASP.NET webform對post的處理,最常使用的就是postback,在server端觸發control event。如果沒有viewstate,那postback後,剛剛在網頁上輸入的值就會消失。
沒有ViewState的輔助,PostBack就失去了依據。

What is ViewState
ViewState簡單來說,就是類似一份dictionary,用來存放ASP.NET頁面上controls的狀態值給兩個連續的postback使用。
ViewState可以想像從asp延伸過來的,用hidden記值,把要記的都放在各個hidden裡面,方便等等重新Render的塞值。而下一次的postback,會再把這個hidden post回server端,就可以知道上一次controls的狀態值。

Where is ViewState
ASP.NET會將ViewState Render到HTML,並存放在hidden。
例如:HTML sample code

<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="/wEPDwUKMTcxODU4OTc0MWRkXFVYlLGlkSawgvMi9dah0zKdlVI=" />

如何在code-behind自訂需要的ViewState
例如:

this.ViewState["myKey"] = "myValue";

Get與Set就類似Dictionary的用法。

ViewState的問題
為了記住兩次postback之間的control狀態值,得Render很多編碼後的文字到HTML中,會增加page size,所以可能造成頻寬問題。
且ViewState只有encode,而非encryption,要避免放有安全性議題的資料到viewstate

如何解決ViewState問題
1.不要用,例如EnableViewState設為false,可以設定Page或Server Controls不使用ViewState。
2.謹慎使用,例如:無安全性問題、頻寬充足、不需要用的就關掉、避免postback(如ajax)、採用其他方式記錄user state、頁面設計小一點、壓縮ViewState等等...

最後,請想學習的客倌,看完這篇文章思考一下,下列的問題該如何回答:
1.什麼是無狀態的http?
2.ViewState的目的為何?
3.沒有ViewState會有什麼問題?
4.到底什麼是ViewState?
5.ViewState存放在哪裡?
6.如何在code-behind自訂ViewState的存取?
7.ViewState有什麼樣的問題與特性?
8.要怎麼樣避免ViewState的問題?


上一篇
91之ASP.NET由淺入深 不負責講座 Day2 - PostBack
下一篇
91之ASP.NET由淺入深 不負責講座 Day4 - Server Controls
系列文
ASP.NET 由淺入深30

1 則留言

0
timloo
iT邦研究生 2 級 ‧ 2010-10-08 09:01:04

請問view state 和 session cookie 這類的變數,做為儲存,是有那些不同呢?

是生命長度的不同,還是有其他的不同??

可以硬用session,來解view state ,會無法解嗎?

謝謝!!

就是91 iT邦研究生 4 級 ‧ 2010-10-08 09:33:58 檢舉

謝謝您的回應,有看到您在Day11-User State的回應了,這個case在那邊討論會比較精準。
麻煩有興趣的人可以移駕過去Day11:http://ithelp.ithome.com.tw/question/10052697
不過還是先簡短的提出幾個重點來解決您的疑惑:
session拿來取代viewstate,基本用法上絕對沒問題。但有太多要注意的issue囉。session吃server記憶體,而且每一個連線會有一份,而且只要沒有離線、還沒到回收記憶體的時間時,server記憶體就會被佔著。假如一個連線中用了太多太多的session (想像一下每一個control的viewstate都改成session,或是放了一張有兩百萬筆資料的dataTable到session),假設是10MB。 500個連線做一樣的事,就是5G,RAM再多也不夠吃...所以要注意concureent user的數目,以及放的東西合不合適。session也有許多會遺失的issue,在Day 11中有reference到另一篇整理好的文章。 ViewState最重要則是要考慮頻寬的因素,因為他會讓page size暴增。

希望簡單的描述,可以讓您抓到您要的感覺 :)

我要留言

立即登入留言