12

そのコントロールのイベントは「暗黙の」トリガーとして機能するため、ネストされた UpdatePanel 内のコントロールによって最上位の UpdatePanel が更新される (したがって、両方の UpdatePanel が更新される) という印象を受けます。あれは正しいですか?

私はこのようなものを配線しようとしてきました-

UserControl

   Parent UpdatePanel

   "Show" button

      ASP:Panel

         Dynamically added UserControls, each with UpdatePanels

[表示] ボタンをクリックすると、ASP:Panel が表示され、いくつかのバックエンド ロジックに基づいて、それ自体に UserControls を動的に追加し始めます。

動的に追加された各コントロール (以下、UserControls) には、それぞれ独自の Atlas 対応のボタンとリンクがあるため、UpdatePanels もあります。現在、UserControls の 1 つのリンクをクリックすると、ASP:Panel のコンテンツ全体が再レンダリングされているかのように消えます。動的に追加されたすべてのコントロールが非表示になり、クリック イベントがデバッガーにキャッチされません。

ここで起こっていることは、ネストされた更新パネルに存在するコントロールが、「暗黙の」トリガーを起動しているため、親の UpdatePanel をポストバックさせていることだと思います。UserControls が自律的に動作し、それらを含む ASP:Panel を台無しにしない方法はありますか?

そうでない場合、ここでどのような戦略を追求する必要がありますか? (おそらく多数の) UserControls の 1 つでイベントが発生するたびに ASP:Panel 全体を再レンダリングする必要がある場合は、UserControls を再作成する必要があり、作成に少し手間がかかります。また、それらを再作成するには、ある種のビュー ステートを保持する必要があります。私はASP.NETに少し慣れていないので、威圧的に聞こえます。できれば最上位の UserControl と ASP:Panel を更新せず、動的に追加された各 UserControl を起動させ、独自のイベントを非同期的に処理させます。

編集:コントロールを動的に追加する代わりに、マークアップに追加しました(悪い解決策ではありません)。コントロールが動的に追加されるのではなく、マークアップに存在するようになったため、コントロールが消える問題はなくなりました。ただし、1 つではなくすべての UserControls がポストされるため、親 UpdatePanel のポストは依然として大きなパフォーマンス ヒットです。UserControl ポストバックを 1 つだけ作成するにはどうすればよいですか? また、動的に追加した場合にコントロールが消える問題を解決する方法を知りたいですか?

4

2 に答える 2

18

最初に、覚えておいてください: UpdatePanelsはページのライフサイクルを変更しません。

すべてのコントロール ツリー (UpdatePanels を含む)は、通常のポストバック ライフサイクルと同様に再構築する必要があります。1 2 UpdatePanelsは、レンダリングされた (HTML) ビューの一部のみが返されるようにします。すべての UpdatePanels削除すると、完全なポストバックを除いて同じ動作になります。たとえば、ネストされた UpdatePanel を表す HTML のみ (おそらくデータが変更されたため) が XHR 応答で返される場合があります。

「真」の AJAX を取得するには、ページ メソッドを検討してください。あるいは、DevExpress (およびおそらく Telerik など) は、UpdatePanels に似た独自の形式の「コールバック パネル」を提供しますが、ライフサイクルの一部をバイパスできます (その結果、ViewState モデルを完全にはサポートしないことがよくあります)。または独自の癖を導入する可能性があります)。


上記を理解していないことが、コントロールが「消える」最も可能性の高い理由ですが、ここに私のルールがあります。[ネストされた] UpdatePanels を「自動的に」動作させないでください。

動的コントロールとネストされた UpdatePanels使用するエッジ ケースが発生します。これを処理する良い方法があるかもしれませんが、私は何度も失敗しました。

代わりに、更新パネルごとに、次のように実行します。

UpdateMode="Conditional"
ChildrenAsTriggers="False"

「Conditional」UpdateMode では、Trigger コントロールを手動で指定するか、必要に応じて呼び出しますpanel.Update()(ただし、これによりコントロールが配線されます)。ニーズによってはChildrenAsTriggers="True"、同様に機能する場合もあります。大きなことは、UpdateModeがデフォルトの「常時」ではないことです。

このアプローチに切り替えた後、ネストされた UpdatePanelsに問題はありません。まあ、ほとんど問題はありません。

ハッピーコーディング!


1部分レンダリング (ScriptManager 内) が無効になっているページが正しくレンダリングされない場合 (たとえば、すべての要求が完全なポストバックである場合)、UpdatePanels で正しく動作することを期待/信じる理由はありません。

2再レンダリングされないコントロールのために、コントロール ツリーでコストのかかる再計算を「チート」することが保証される場合があります。ただし、これらの高度なケースは、パフォーマンス分析で特定のニーズがあることが示された場合にのみ実行する必要があると考えています。

于 2012-06-23T05:06:45.927 に答える