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

[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等等...



最後,請想學習的客倌,看完這篇文章思考一下,下列的問題該如何回答:

  1. 什麼是無狀態的http?
  2. ViewState的目的為何?
  3. 沒有ViewState會有什麼問題?
  4. 到底什麼是ViewState?
  5. ViewState存放在哪裡?
  6. 如何在code-behind自訂ViewState的存取?
  7. ViewState有什麼樣的問題與特性?
  8. 要怎麼樣避免ViewState的問題?



blog 與課程更新內容,請前往新站位置:http://tdd.best/