[ASP.NET]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等等...
最後,請想學習的客倌,看完這篇文章思考一下,下列的問題該如何回答:
- 什麼是無狀態的http?
- ViewState的目的為何?
- 沒有ViewState會有什麼問題?
- 到底什麼是ViewState?
- ViewState存放在哪裡?
- 如何在code-behind自訂ViewState的存取?
- ViewState有什麼樣的問題與特性?
- 要怎麼樣避免ViewState的問題?
blog 與課程更新內容,請前往新站位置:http://tdd.best/