2009-01-08 17 views
7

如果我有一個簡單的數據要存儲(例如整數或字符串)我可能會選擇將其存儲在ViewState中,或使用HiddenField控件。ViewState或HiddenField

爲什麼我會選擇一個呢?

視圖狀態

  • 硬供用戶進行解碼(被認爲不是不可能的),這可能是可取的

HiddenField

  • 值可以在JavaScript
可以使用

是否還有其他優點缺點?

+0

您還可以將數據存儲在會話對象 – 2009-01-08 13:34:00

+0

是的,我可以將其存儲在會話中,但在這種情況下,數據僅與相關頁面相關,因此出於封裝原因,我寧願將其存儲在頁面上。 – 2009-01-08 13:50:33

+1

將會話中的數據存儲在本質上會使其成爲全局範圍。將它存儲在頁面中會減少它的範圍,這是更好的設計實踐。 – 2009-01-08 13:52:40

回答

6

不是真的,ViewState實際上存儲在一個隱藏字段中,所以唯一真正的區別是編碼。

除非您需要使用JavaScript處理值,或者您希望完全關閉此頁面上的ViewState,那麼我會使用ViewState。主要是因爲有第三方工具(like this one)瞭解ViewState並且不瞭解您的自定義隱藏字段。

0

ViewState存儲在頁面本身,因此它增加了頁面大小,它可能會導致performance issues

此外,我們可以將應用程序配置爲save the viewstate on server,而不是在頁面本身上,以防止某些安全問題。

jomit

3

從可維護性的角度來看,我會使用ViewState。它可以讓你編寫更少的代碼,這可以歸結爲軟件中的更少的故障點。這也意味着任何追隨你的開發人員都能更輕鬆地維護你的解決方案。

如果您對此不太滿意,可以在頁面上編寫一個屬性存取器,作爲外觀從ViewState中檢索值。後來,如果您覺得不得不將其轉換爲隱藏字段,那麼訪問者可以在其他代碼中無縫地處理該開關。只要確保你記錄你這樣做的理由。

0

Viewstate只在您所在的頁面上發佈或發佈回來。一個隱藏字段,你可以通過使用Page對象|上一頁方法,像這樣訪問你導航到(以及其他數據)下頁上的數據:

string term = ((TextBox)Page.PreviousPage.FindControl("txtSearchTerm")).Text; 
0

隱藏字段是頁和無形的值可以在視圖源中查看,但視圖狀態的值被編碼且不可讀。

隱藏字段值將發佈到下一頁。 (注意:使用server.transfer來獲取隱藏字段的值)。