1

クライアント側の対話を処理し、前後に通信するために、JavaScript を使用したScriptControl(が必要) があります。ページ上のコントロールの 1 つまたは複数のインスタンスで、すべてが完全に機能します。並べ替えを使用してコントロールを内部に配置しましたが、それでも機能します。ただし、を配置すると、並べ替えるたびに、インスタンスごとに次のエラーが発生します。ScriptManagerICallbackEventHandlerGridViewGridViewUpdatePanel

Sys.InvalidOperationException: Two components with the same id 'GridView_ctl02_MyControl' can't be added to the application.

誰かがこれを解決する方法について正しい方向に向けることができますか? 同じ ID を持つ新しいオブジェクトを試す前ScriptManagerに、古いオブジェクトを破棄しないと仮定しています。/の組み合わせは、置き換えられるオブジェクトの破棄を自動的に処理すると思いましたか?Sys.UI.Control$create()UpdatePanelScriptManager

編集:このページは、私が考えたことをサポートしているようです: http://msdn.microsoft.com/en-us/library/system.web.ui.scriptmanager.registerdispose.aspx

RegisterDispose メソッドを使用して、UpdatePanel コントロール内にあるコントロールの破棄スクリプトを登録します。非同期ポストバック中に、UpdatePanel コントロールを更新、削除、または作成できます。パネルが更新または削除されると、UpdatePanel 内にあるコントロールに登録されている破棄スクリプトが呼び出されます。一般的なページ開発シナリオでは、RegisterDispose メソッドを呼び出す必要はありません。

再確認するためalert("dispose " + this.element.id)に、JavaScriptdispose()関数内に配置しました。すべてのインスタンスがアラートを出しますdispose GridView_ctl02_MyControlが、その後、2 つのコンポーネントが同じ名前を持つことはできないというエラーが表示されますGridView_ctl02_MyControl。私は途方に暮れています...

4

1 に答える 1

1

ページがアンロードされると、コンポーネントのdispose()メソッドが呼び出され、Sys.Application.removeComponent()また呼び出されます。UpdatePanelリロードすると、メソッドのみがdispose()呼び出されます。今のところSys.Application.removeComponent(this);、 の中に入れることでこれを解決しましたdispose()。$remove ($create に似ています) などのショートカットは見つかりませんでした。

関連する DOM 要素 (存在する場合) が UpdatePanel に置き換えられた後でも、コンポーネントをロードしたままにできるという点で、これは論理的に思えます。このようにして、コンポーネントの寿命をより細かく制御できます。ユースケースを想像することはできませんが、思いつくことができると確信しています。

私が離れていて、より良いアプローチがある場合は、お知らせください!

于 2010-10-21T18:01:49.577 に答える