13

ASP.NET AJAX ページで状態を維持することに問題があります。短いバージョン:非同期呼び出し中にサーバーが行った状態の変更を反映するために、非同期コールバックが行われた後にページの ViewState を更新する何らかの方法が必要です。

これはよくある問題のようですが、説明のために私のシナリオを説明します。

私は、いくつかの JavaScript 拡張機能 (つまり、列と行をドラッグ アンド ドロップする機能) を備えたグリッドのようなコントロールを持っています。列または行が新しい位置にドロップされると、AJAX メソッドが呼び出されてコントロール サーバー側に通知され、対応するサーバー側イベント ("OnColumnMoved" または "OnRowMoved") が発生します。

ASP.NET AJAX 呼び出しは、既定では、ページ全体を要求として送信します。このようにして、ページは完全なライフサイクルを通過し、viewstate が保持され、RaiseCallbackEvent メソッドが呼び出される前にコントロールの状態が復元されます。

ただし、AJAX 呼び出しはページを更新しないため、列または行が移動された後でも、ViewState はコントロールの元の状態を反映します。したがって、クライアント側のアクションが 2 回目に発生すると、AJAX 要求がサーバーに送られ、ページとコントロールが再度構築されて、最初の列または行が移動された後の状態ではなく、コントロールの最初の状態が反映されます。

この問題は、多くの意味合いにまで及びます。たとえば、グリッドに新しい項目を追加するクライアント側/AJAX アクションがあり、行がドラッグされた場合、グリッドはクライアント側よりも項目が 1 つ少ないサーバー側で構築されます。

最後に、私の特定の例について最も真剣に説明します。実際のデータ ソース オブジェクトは、ページの ViewState に格納されます。これは、操作されたデータのステートフル コピーを保持できるようにするための設計上の決定であり、多くの操作の後に DB にコミットするか、ユーザーがバックアウトした場合に破棄することができます。それを変えるのはとても難しい。

繰り返しますが、AJAX メソッドが起動された後、コールバックでページの ViewState を更新する方法が必要です。

4

5 に答える 5

2

いずれにせよ、すでに ViewState をシャッフルしている場合は、UpdatePanel を使用することもできます。部分的なポストバックにより、ページの ViewState が自動的に更新されます。

于 2008-08-07T16:19:34.683 に答える
1

このブログ投稿を確認してください: Tweaking the ICallbackEventHandler and Viewstate。著者は、あなたが経験しているまさにその状況に対処しているようです:

そのため、ICallbackEventHandler を使用する場合、コールバックの状態管理を更新するには、克服しなければならない 2 つの障害があります。まず、読み取り専用のビューステートの問題です。もう 1 つは、コールバックをトリガーする前に、ユーザーがページに加えた変更を実際に登録することです。

これを解決する方法に関する彼の提案については、ブログ投稿を参照してください。また、同じ問題について議論しているこのフォーラムの投稿もチェックしてください。

于 2008-08-05T14:25:19.750 に答える
0

私は実際にあなたが提供したこれらのリンクの両方を見つけましたが、指摘したように、それらは単に問題を説明しているだけであり、解決していません. ブログ投稿の著者は、別の ViewState プロバイダーを使用することによる回避策を提案していますが、残念ながら、この場合は可能ではありません... ViewState の詳細をそのままにして、何が行われているかを確認する必要があります。すぐに使用できます。

于 2008-08-05T14:54:23.670 に答える
0

Telerik の RadAjaxManagerを使用して、かなり洗練されたソリューションを見つけました。それは非常にうまく機能します。基本的に、ポストバックを呼び出す可能性のある各コントロールを登録し、ポストバックが非同期で実行された後に再描画する必要がある各コントロールを登録します。はRadAjaxManager非同期ポストバック後に DOM を更新し、ViewState影響を受けるすべてのコントロールを書き換えます。をのぞいてReflectorみると、ボンネットの下は少しぎこちないように見えますが、私の目的には合っています。

于 2008-08-08T04:18:51.737 に答える
0

組み込みの ASP.NET AJAX UpdatePanel が同じことを行うのに、カスタム コントロールを使用する理由がわかりません。

複雑さが増し、サポートが少なくなり、他のユーザーがアプリで作業するのが難しくなります。

于 2008-08-08T04:56:31.880 に答える