[VS2010/.NET 4.0贈書活動自我修練] ViewState

  • 3178
  • 0
  • 2010-09-13

[VS2010/.NET 4.0贈書活動自我修練] ViewState

在ASP時代我們在撰寫網頁程式時,頁面上的狀態都必須靠程式人員在Form Submit的來來回回過程中

自行想辦法保留,而在ASP.NET裡這一切變的容易了,因為ViewState幫我們處理了

在ASP.NET網頁上,檢視原始碼我們可以看到有個名為_VIEWSTATE的Hidden input,該欄位的Value資料會隨著aspx網頁上

的Control及資料多寡,其大小會有所不同

image

此外由於ViewState是利用HTML Hidden Input的方式來保留值,因此無法跨頁面存取,然而除了自動保留的值之外

若是想在程式裡利用ViewState來暫存取資料,可以使用以下語法來進行

存入:ViewState["KeyName"] = " This is a ViewState"; 

取得:ViewState["KeyName"].ToString();

不過要注意的是ViewState的大小會影響到網頁的效能,耗費網路傳輸的時間

 

在.NET 3.5以前,對於頁面的ViewState 使用與否,可以利用設定 EnabledViewState true or false來達成

不過若是在Page層級即宣告EnabledViewState 為false,則頁面中control的EnabledViewState 即使為true,依然是無作用的

(PS:部份Control的state是由ControlState來負責)

image

 

範例:將page EnableViewState設為false,GridView的EnableViewState設為true(預設值),並且僅在第一次頁面Load進來時bind資料給GridView

if (!IsPostBack) { SqlConnection conn = new SqlConnection(System.Web.Configuration.WebConfigurationManager.ConnectionStrings["Demo2010ConnectionString"].ToString()); SqlCommand command = new SqlCommand(); conn.Open(); command.Connection = conn; command.CommandText = "SELECT top 20 [id], [filetype] FROM [casecontent]"; SqlDataReader dr = command.ExecuteReader(); this.GridView1.DataSource = dr; this.GridView1.DataBind(); command.Connection.Close(); }

當Button Click進行postback時,GridView的資料會因為page EnableViewState設為false,而造成資料並無法被留存

image

image

 

在.NET 4.0對於ViewState有了更彈性的設計,在.NET 4.0裡多了個ViewStateMode

,則是允許Control自行決定是否聽從父控制項的ViewState設定,ViewStateMode具有以下三個列舉值設定

 

(1) Inherit:繼承父控制項的設定


(2) Enabled:即使父控制項沒有開啟ViewState的狀態,仍然可以開啟自身的ViewState
 

(3) Disabled:即使父控制項是有開啟ViewState的狀態,仍然可以關閉自身的ViewState

 

以上述的範例來看,我們可以做到關閉page的ViewState,但GridView的ViewState依然有效

1.將Page的ViewStateMode設為Disabled

image

2.將GridView的ViewStateMode設為Enabled

image

因此利用.NET 4.0 ViewStateMode可做到將整個 Page 的ViewState 關閉,但又視所需將需要 ViewState 的 Control ,開啟 ViewState。

不過要注意的是雖然有了ViewStateMode可以協助我們更彈性的控制ViewState,但EnableViewState依然是高於 ViewStateMode的控制權

換言之,如果把EnableViewState給關閉了,即使control設定了ViewStateMode,那麼ViewState依然是無作用的

 

藉由ViewStateMode的提供,我們可以在頁面效能上多了一個可以改善調整的方式,試著減少不必要的ViewState資料量,讓頁面在傳輸上size

變小,對於效能的提升也是一個幫助

 

 

參考資料:

ViewState慨觀

Understanding ASP.NET View State

PageStatePersister.ControlState 屬性

 

 

 

 

 

 

ViewStateMode 列舉型別

 

若本文對您有所幫助,歡迎轉貼,但請在加註【轉貼】及來源出處,並在附上本篇的超連結,感恩您的配合囉。

By No.18