2010-06-09 56 views
5

我已經在網上搜索了答案,並看到主要變量保存在page.prerender事件的viewstate中。然後,該變量的值在頁面加載事件中被重新設置。何時在viewstate中保存一個變量?

但是,當我在prerender或load事件的viewstate中保存一個變量時,viewstate如何在代碼隱藏後動態更改變量的值後如何存儲該變量的值?

比方說,加載頁面後,用戶單擊了一個按鈕,該按鈕更改其onClick事件中變量的值。然後自按鈕被點擊後引發的回發事件。根據我的說法,如果只在prerender事件中將變量保存在視圖狀態中,則新值應該已經丟失並且不能保存在視圖狀態中。因爲回發時prerender事件不會觸發並且值不能被保存。

在回發事件上升之前,不應該將變量保存在視圖狀態中嗎?

我錯了嗎?如果是這樣,如果viewstate保存在prerender事件中,viewstate如何存儲變量的新值?

感謝提前答案..

+1

看一看[ASP.NET頁面生命週期@ MSDN(http://msdn.microsoft.com/en-us/library/ms178472.aspx) – 2010-06-09 23:25:35

回答

5

我懷疑你很困惑保存ViewState,即。將內存中的ViewState集合序列化爲字符串表示或序列化的中間對象,並使用常規的訪問器方法實際修改該ViewState內存中對象。

您可能會聽到的是SaveViewState()方法在PreRender事件後調用。但是,這與您修改ViewState集合的內容無關。

結帳點7.預渲染對象8。ViewState保存文章The ASP.NET Page Life Cycle。有一個很好的MSDN文章也涉及到這一點。

alt text http://i.msdn.microsoft.com/dynimg/IC152667.gif

+1

非常不錯的文章kervin,謝謝。所以,我似乎也可以重寫SaveViewState事件並在該事件中保存我的變量,而不是將其保存在prerender事件中。很高興知道,即使我現在不會使用它.. – 2010-06-10 00:11:36

-2

ViewState是通過一個隱藏字段維護,因此具有回發之前完成它的「設置」。 如果您正在設置它,並嘗試在同一頁面中讀取它,它將無法工作。您可以嘗試使用Session對象,該對象將值/值設置到內存中。

+0

視圖狀態可以在一個頁面中讀取週期。這可能是頁面和事件生命週期的一個問題。例如在按鈕的點擊處理程序執行之前讀取該值。 – 2010-06-09 23:24:27

0

作爲每ASP.Net Page Lifecycle Overview(重點是礦)

PRELOAD()

的頁面後引發負載查看狀態自身和所有控制,以及它處理所附帶回發數據之後Request()實例。

....

SaveStateComplete()

後視圖國家上調和控制狀態已保存的頁面和所有控件。 此時對頁面或控件所做的任何更改都會影響渲染,但在下一個回發上不會檢索更改。

由於Control Events和PreRender事件發生在這兩者之間,因此您的數據應該保留在ViewState中。

+0

謝謝保羅。在閱讀頁面生命週期後,我意識到我的錯誤。我以某種方式認爲Page_PreRender在Page_Load之前觸發。 我現在知道後臺發生了什麼: 1)當用戶點擊一個按鈕時,第一頁被回傳並且Page_Load事件觸發。 2)然後將新值分配給變量 3)最後,Page_PreRender事件觸發並將變量保存到視圖狀態。 – 2010-06-09 23:47:32