2009-12-16 76 views
3

而不是使用會話對象或存儲到數據庫,我存儲的臨時變量,我需要堅持自定義ViewState變量。例如,ViewState(「MyField1」)= 1ViewState在UpdatePanel刷新時丟失了?

當用戶點擊瀏覽器Rrefresh按鈕時,Page.IsPostback返回False並且ViewState消失。

我的問題是。如果用戶可以刷新Viewstate,爲什麼會有人使用它?

我知道Refresh會重新發布上次提交的頁面,爲什麼Page.IsPostback重置爲False並且ViewState會被吹走?

火焰我,如果你想創建一個潛在的問題,DUP,但是我在這裏讀其他的帖子,並且不下沉......

更新到原帖:

我現在認爲它與由於點擊UpdatePanel內的按鈕而執行的回發有關。有人可以幫助解釋這一點嗎?

回答

4

當客戶端刷新其瀏覽器時,會重新提交客戶端(可能是GET or a POST)發出的最後一個完整頁面請求。它不會重新提交AJAX請求,例如由更新面板事件觸發器(「部分頁面回發」)生成的請求。

事實上,Page.IsPostbackfalse當你刷新頁面意味着你原來的請求是GET,所以這裏的什麼可能發生的事情:

1)在最初的請求,客戶端沒有表單數據發送到服務器 - 因此沒有包含視圖狀態數據的隱藏字段(Understanding ASP.NET View State非常詳細,但是如果你想真正理解正在發生的事情,可以進行很好的閱讀)。在處理此請求時,ASP.NET可能會將一些視圖狀態發送回客戶端,但原始請求只是一個URL。

2)當用戶單擊UpdatePanel中的按鈕時,它們會觸發部分回發,在此期間MyField設置爲1. UpdatePanel更改客戶端的視圖狀態以反映新值。

此時,如果用戶通過常規方式提交POST請求,例如單擊按鈕,則視圖狀態將包含更新後的信息。

如果用戶點擊「刷新」,他們會重新提交第1步中的原始請求,但沒有表單數據,因此也沒有視圖狀態。

+0

查看更新至原文 – ChadD 2009-12-16 17:58:17

+0

根據新的信息更新了我的答案。 – 2009-12-16 18:19:04

1

你在哪裏設置ViewState?你在哪裏重新讀取你的ViewState值?也許oyu在asp.net調用LoadViewState()方法之前檢查它的內容。

+0

查看此用戶原文的更新 – ChadD 2009-12-16 17:58:56

+0

我在Web Form的Page_Load事件中檢查了它 – ChadD 2009-12-17 02:17:28

1

用戶點擊刷新和使用updatepanel不能很好地協同工作。我認爲這就是爲什麼人們說WebForms在Web編程上提供了一個漏洞的抽象,並且一些正在轉向mvc。

如果您對遷移不感興趣,我會告訴您不要將updatepanel用於太長時間或大型操作,您可以假設用戶可能會刷新頁面。將其用於諸如dropdown2項目之類的小項目時,在dropdown1的選擇更改時會發生更改。

如果你只是依賴視圖狀態,在一個updatepanel中包含大量的功能將會引起麻煩。

0

你的問題是,「爲什麼會有人使用它。」

Viewstate派上用場,因爲您知道的數據是由後發生的。點擊刷新不是回發,而是新的要求。

因此可以說你正在瀏覽一個數據網格,並且你需要知道關於他們點擊了什麼的某些數據,在點擊事件中你可以將這些數據存儲在視圖狀態並在頁面生命週期的其他時間處理它,或後續的帖子。

ViewState的優點是它只是嵌入到HTML中,所以它是所有客戶端。在SessionState是服務器端的情況下,如果在會話中存儲大量數據,則可以使Web或db服務器更加努力地處理該數據。

希望這會有所幫助。

+0

不,我知道這一切。問題是爲什麼任何人使用它,如果它在用戶刷新時被清除。我對我的問題的更新解釋說,由於使用更新面板而被清除,但我尋求解釋。不過謝謝,:-) – ChadD 2009-12-17 12:39:52