Asp.net

使用 ASP.NET AJAX / ICallbackEventHandler 跟踪狀態

  • October 25, 2021

我在維護 ASP.NET AJAX 頁面中的狀態時遇到問題。簡短版本:在進行非同步回調後,我需要一些方法來更新頁面 ViewState,以反映伺服器在非同步呼叫期間所做的任何狀態更改。

這似乎是一個常見問題,但我將描述我的場景以幫助解釋:

我有一個類似網格的控制項,它具有一些 JavaScript 增強功能——即拖放列和行的能力。當一列或一行被放到一個新位置時,呼叫一個 AJAX 方法來通知控制伺服器端並觸發相應的伺服器端事件(“OnColumnMoved”或“OnRowMoved”)。

預設情況下,ASP.NET AJAX 呼叫將整個頁面作為請求發送。這樣頁面會經歷一個完整的生命週期,視圖狀態會被持久化,並且控制項的狀態會在呼叫 RaiseCallbackEvent 方法之前恢復。

但是,由於 AJAX 呼叫不會更新頁面,因此 ViewState 會反映控制項的原始狀態,即使在移動列或行之後也是如此。因此,第二次發生客戶端操作時,AJAX 請求會發送到伺服器,並且頁面和控制項會重新建構以反映控制項的第一個狀態,而不是移動第一列或第一行之後的狀態。

這個問題延伸到許多方面。例如,如果我們有一個客戶端/AJAX 操作來向網格添加一個新項目,然後拖動一行,則網格是在伺服器端建構的,比客戶端少一個項目。

最後,對於我的具體範例,最重要的是,我們正在操作的實際數據源對象儲存在頁面 ViewState 中。這是一個設計決定,允許保留被操縱數據的有狀態副本,這些副本可以在多次操作後送出給 DB,或者在使用者退出時丟棄。這是很難改變的。

因此,再次,我需要一種方法來在觸發 AJAX 方法後在回調時更新頁面 ViewState。

如果您已經在調整 ViewState,那麼您不妨使用 UpdatePanel。它的部分回發自動更新頁面的 ViewState。

查看這篇博文:調整 ICallbackEventHandler 和 Viewstate。作者似乎正在解決您遇到的情況:

因此,當使用 ICallbackEventHandler 時,您需要克服兩個障礙來更新回調的狀態管理。首先是只讀視圖狀態的問題。另一個實際上是在觸發回調之前註冊使用者對頁面所做的更改。

有關如何解決此問題的建議,請參閱部落格文章。另請查看此論壇文章,其中也討論了相同的問題。

引用自:https://stackoverflow.com/questions/2328