ASP.NET 網頁的 view state 機制雖然很方便我們保存網頁的狀態,但有些情況並不需要 view state,若能針對特定控制項關閉 view state,將有助於減少網路傳輸的資料量,並提升網頁的回應速度。
EnableViewState
在 ASP.NET 4.0 之前,網頁和控制項雖然有 EnableViewState 屬性可以控制要不要啟用 view state,但是卻不夠彈性,因為一旦將頁面(或父層控制項)的 EnableViewState 設為 False,那麼無論其子控制項是否啟用 view state 都沒有用,一律為關閉。因此,以往如果要針對特定幾個控制項啟用 view state,就只能讓整個頁面的 EnableViewState 維持預設的啟用狀態,然後再去個別設定控制項的 EnableViewState 為 False。
執行結果如下圖:
喔!對了,如果你想寫程式測試看看,記得不要用 TextBox,那沒有用。就算你將 TextBox 的 ViewState 關掉,它還是會自動維護狀態,因為 TextBox 的值並不是存放在 ViewState,而是在 HTTP POST header 裡面。
延伸閱讀:
EnableViewState
在 ASP.NET 4.0 之前,網頁和控制項雖然有 EnableViewState 屬性可以控制要不要啟用 view state,但是卻不夠彈性,因為一旦將頁面(或父層控制項)的 EnableViewState 設為 False,那麼無論其子控制項是否啟用 view state 都沒有用,一律為關閉。因此,以往如果要針對特定幾個控制項啟用 view state,就只能讓整個頁面的 EnableViewState 維持預設的啟用狀態,然後再去個別設定控制項的 EnableViewState 為 False。
ViewStateMode
ASP.NET 4.0 為網頁和控制項增加了 ViewStateMode 屬性,讓你可能夠更方便地控制網頁的 view state。原本的 EnableViewState 還是有作用,而且是扮演「總開關」的角色。也就是說,當 EnableViewState 為 True 時,ViewStateMode 屬性的設定才有意義。
ASP.NET 4.0 為網頁和控制項增加了 ViewStateMode 屬性,讓你可能夠更方便地控制網頁的 view state。原本的 EnableViewState 還是有作用,而且是扮演「總開關」的角色。也就是說,當 EnableViewState 為 True 時,ViewStateMode 屬性的設定才有意義。
ViewStateMode 屬性值可以是下列三者之一:
- Inherited:繼承上層控制項的設定。此為預設值。
- Enabled:啟用此控制項的 view state。
- Disabled:關閉此控制項的 view state。
怎樣設定才能提升效率?
基本上,減少 view state 的資料量就能提升效率。一般來說,我們不用去動總開關 EnableViewState 的屬性值(預設為 True),而只要使用 ViewStateMode 屬性來控制,即可達到我們的目的。比如說,將整個頁面或某個上層控制項的 ViewStateMode 設定為 Disabled,再針對需要啟用 view state 的控制項來個別設定其 ViewStateMode 為 Enabled。
參考下圖的範例程式碼:
在 Page_Load 事件處理常式中,撰寫以下程式碼來觀察 ViewStateMode 對控制項的影響:
protected void Page_Load(object sender, EventArgs e) { if (!Page.IsPostBack) { Label1.Text = "Page_Load 時間:" + DateTime.Now.ToString(); Label2.Text = "Page_Load 時間:" + DateTime.Now.ToString(); } }
執行結果如下圖:
喔!對了,如果你想寫程式測試看看,記得不要用 TextBox,那沒有用。就算你將 TextBox 的 ViewState 關掉,它還是會自動維護狀態,因為 TextBox 的值並不是存放在 ViewState,而是在 HTTP POST header 裡面。
延伸閱讀:
沒有留言: