2010-10-28 67 views
2

我想存儲一些變量,這些變量將在整個生命週期中被引用,從PreInit事件中的db訪問開始。 ViewState不是一個選項,因爲如果在頁面生命週期中這麼早保存,ViewState將不會保留。由於數據不應該被用戶改變,那麼最好的選擇是什麼?ViewState的替代方案

回答

2

您可以使用會話來存儲您的數據。我不確定你係統的用戶數量,但假設你想存儲的數據很小,這不會是一個問題。'此外,除非您使用SessionPageStatePersister(或其他服務器端持久存儲器)或加密ViewState,否則用戶仍可能更改ViewState。這可能會更困難,但仍然有可能。默認情況下,ViewState使用HiddenFieldPageStatePersister,並將ViewState存儲在每個頁面的隱藏字段中(作爲編碼字符串)。只是值得考慮的事情。

+0

會議將是我最後的手段,雖然看起來我沒有選擇。 ViewState默認情況下是加密的,所以它是可以改變的,但是如果沒有機器密鑰則不可能一致。我接受你的答案,因爲它是第一個,雖然每個人都說會話。 – Shagglez 2010-10-28 14:52:31

0

根據範圍:SessionApplication

會議
如果你想每個用戶存儲的數據

應用
如果你想存儲適用於所有用戶的數據

0

您可以將數據存儲在隱藏字段中,如果您想隱藏它,那麼您可以ld使用某種咒語。當然,這些值也只會在頁面生命週期的後期階段加載。會話對象將是明顯的選擇,儘管這不是每個人都喜歡的方法。

0

會話可能在PreInit中不可用,但您可以將它們存儲在變量中,直到稍後的頁面生命週期任務,然後將它們存儲在會話中。我可能會錯誤的會話功能。此外,緩存是一個選項,但緩存不是用戶特定的;您可以通過附加他們的用戶ID或會話ID來使其成爲特定用戶。

0

會議可能是你最好的選擇。我們必須使用會話來存儲一些用戶信息,但由於訪問得太早而出現了一個錯誤。該錯誤是[HttpException]: Session state has created a session id, but cannot save it because the response was already flushed by the application."但它通常會顯示爲PageRequestMangerParserErrorException。超級好玩的狩獵下來。一個hackish的解決方法是編寫到您的Global.asax代碼背後:

public Session_Start(object sender, EventArgs e) 
{ 
    string sessionId = Session.SessionID; 
} 

訪問的SessionID強制ASP.NET引擎去它通常會之前建立的會話,從而能夠及早使用它。

在會話(或應用程序)之外,您有兩個其他選項:客戶端存儲和永久存儲。後者是一種奇特的說法:「把它塞入數據庫中」,當然也有類似的選擇。

客戶端存儲與查看狀態相似,但更受控制。您可以使用隱藏字段或Cookie。事實上,一個cookie可能適合你,但如果你想讓用戶獨立,你需要加密其中的信息。無論如何,您發送給客戶的任何內容都必須承擔妥協,因此請始終進行有效性檢查。