WebForm中的ViewState爲何不能向MVC中的ViewData那樣使用?

(已修改標題,最初的“ViewState與ViewData的區別研究”可能讓大家都把目標都放到是不是持久化上了)

項目開發中新同事問到asp.net WebForm模式中的ViewState與asp.net MVC模式中的ViewData不是一樣的嗎?

比如在WebForm的代碼頁面(如.aspx.cs)中定義:

ViewState["test"] = "abc";

在顯示頁面(如.aspx)中就可以用:

<%=ViewState["test"] %>

進行輸出

在MVC中的Controller中定義:

ViewData["test"] = "abc";

同樣也可以在視圖而中用:

<%=ViewData["test"] %>

進行輸出

這有區別嗎?

有人可能會說在WebForm模式中如果設置了EnableViewState="false",那麼ViewState就不能用了,真的這樣嗎?經測試發現無論EnableViewState爲true或false,上面給的<%=ViewState["test"] %>都是可以正常輸出值的

那是不是說在WebForm中就可以像MVC中那樣用ViewState來代替ViewData了呢?

MSDN對ViewState的定義:

獲取狀態信息的字典,這些信息使您可以在同一頁的多個請求間保存和還原服務器控件的視圖狀態。

代碼定義是這樣的:

protected virtual StateBag ViewState { get; }
可以看到此屬性中只有get方法,也就是說此屬性是隻讀的,可能你會說上面用的:
ViewState["test"] = "abc";
不是在爲它賦值嗎?
這是因爲ViewState是StateBag 類的一個實例,而StateBag類是一個實現了字典接口,所以ViewState是可以存儲鍵值對形式的數據的,只是你不能做類似這樣的操作:
ViewState = new StateBag...
因ViewState 是隻讀的
而MVC中的ViewData是可讀寫的,其代碼定義爲:
public ViewDataDictionary ViewData { get; set; }
所以區別一就是:
ViewState是隻讀的
ViewData是可讀寫的(可被重新定義)
區別二:ViewData可用於一次http請求中的所有視圖頁,如:.aspx/.ascx...,而ViewState只能用於當前後端代碼文件所在的前端顯示頁
比如:
頁面control.ascx存在於頁面default.aspx中,那麼在default.aspx.cs中定義的ViewState["test"]在control.ascx是取不到的
區別三:ViewState主要用來記錄服務器控件的狀態信息,asp.net引擎會自動填充服務器控件的狀態信處到裏面,所以最好不要使用ViewState存放自己的值
區別四:爲了保證ViewState可以正確記錄服務器控件的狀態信息,ViewState中的值應該都是可以轉爲字串形式的(可序列化),而ViewData是可以用來保存各種類型的值的
我目前就發現這幾點,希望大家可以繼續補充,不正確的地方也請指正,謝謝
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章