ASP.NET AJAX ページで状態を維持することに問題があります。短いバージョン:非同期呼び出し中にサーバーが行った状態の変更を反映するために、非同期コールバックが行われた後にページの ViewState を更新する何らかの方法が必要です。
これはよくある問題のようですが、説明のために私のシナリオを説明します。
私は、いくつかの JavaScript 拡張機能 (つまり、列と行をドラッグ アンド ドロップする機能) を備えたグリッドのようなコントロールを持っています。列または行が新しい位置にドロップされると、AJAX メソッドが呼び出されてコントロール サーバー側に通知され、対応するサーバー側イベント ("OnColumnMoved" または "OnRowMoved") が発生します。
ASP.NET AJAX 呼び出しは、既定では、ページ全体を要求として送信します。このようにして、ページは完全なライフサイクルを通過し、viewstate が保持され、RaiseCallbackEvent メソッドが呼び出される前にコントロールの状態が復元されます。
ただし、AJAX 呼び出しはページを更新しないため、列または行が移動された後でも、ViewState はコントロールの元の状態を反映します。したがって、クライアント側のアクションが 2 回目に発生すると、AJAX 要求がサーバーに送られ、ページとコントロールが再度構築されて、最初の列または行が移動された後の状態ではなく、コントロールの最初の状態が反映されます。
この問題は、多くの意味合いにまで及びます。たとえば、グリッドに新しい項目を追加するクライアント側/AJAX アクションがあり、行がドラッグされた場合、グリッドはクライアント側よりも項目が 1 つ少ないサーバー側で構築されます。
最後に、私の特定の例について最も真剣に説明します。実際のデータ ソース オブジェクトは、ページの ViewState に格納されます。これは、操作されたデータのステートフル コピーを保持できるようにするための設計上の決定であり、多くの操作の後に DB にコミットするか、ユーザーがバックアウトした場合に破棄することができます。それを変えるのはとても難しい。
繰り返しますが、AJAX メソッドが起動された後、コールバックでページの ViewState を更新する方法が必要です。