質問

私は持っています ScriptControl (必要 ScriptManager)JavaScriptを使用して、クライアント側の相互作用を処理します ICallbackEventHandler 前後に通信する。すべてが、ページ上のコントロールの1つまたは複数のインスタンスで完全に機能します。コントロールを内部に配置しました GridView 並べ替えで、それでも機能します。しかし、私は置きます GridViewUpdatePanel そして今、私が並べ替えるたびに、私は各インスタンスに対して次のエラーを取得します:

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

誰かがこれを解決する方法について私を正しい方向に向けることができますか?私は仮定しています ScriptManager 古いものを処分していません Sys.UI.Control しようとする前のオブジェクト $create() 同じIDを持つ新しいもの。私は考えました UpdatePanel/ScriptManager 組み合わせは、交換されるオブジェクトの処分に自動的に処理されますか?

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

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

再確認するために私は配置しました alert("dispose " + this.element.id) 私のjavascriptの中 dispose() 働き。すべてのインスタンスアラート dispose GridView_ctl02_MyControl, 、しかしその後、2つのコンポーネントに同じ名前ができないというエラーがあります GridView_ctl02_MyControl. 。私は途方に暮れています...

役に立ちましたか?

解決

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

これは、関連するDOM要素(もしあれば)がUpdatePanelに置き換えられた後でもコンポーネントをロードすることができるという点で論理的に思えます。このようにして、コンポーネントの生活をよりコントロールできます。ユースケースを想像することはできませんが、あなたはそれを思いつくことができると確信しています。

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top