2010-10-21 50 views
1

我有一個ScriptControl(需要ScriptManager)與JavaScript來處理客戶端交互和ICallbackEventHandler來回通信。一切都可以完美地與頁面上的一個或多個控件實例配合使用。我把這個控件放在GridView裏面進行排序,它仍然可以工作。不過,我放置GridViewUpdatePanel現在每當我排序,我得到以下錯誤的每個實例:UpdatePanel內的ScriptControl

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

有人能指出我在如何解決這個正確的方向?我假設ScriptManager在嘗試$create()之前沒有處理舊的Sys.UI.Control對象,並且具有相同的ID。我認爲UpdatePanel/ScriptManager組合會自動處理可能會被替換的對象?

編輯:本頁面似乎支持我的想法:http://msdn.microsoft.com/en-us/library/system.web.ui.scriptmanager.registerdispose.aspx

使用RegisterDispose方法 寄存器的配置是一個UpdatePanel 控制內部控制 腳本。在異步 回發期間,UpdatePanel控件可以更新,刪除或創建 。 當更新或刪除 面板時,將調用任何 爲 UpdatePanel中的控件註冊 的腳本。在典型的 頁面開發場景中,您不需要調用 方法。

只是爲了仔細檢查自己所下的alert("dispose " + this.element.id)我的JavaScript dispose()函數內部。每個實例都提醒dispose GridView_ctl02_MyControl,但之後出現兩個組件不能具有相同名稱的錯誤GridView_ctl02_MyControl。我不知所措...

回答

1

當頁面卸載時,我的組件的dispose()方法被調用,並且Sys.Application.removeComponent()也被調用。當UpdatePanel重新加載時,只調用dispose()方法。現在我已經通過將Sys.Application.removeComponent(this);放入dispose()內解決了這個問題。我沒有找到像$ remove這樣的快捷方式(類似於$ create),這意味着您不需要經常這樣做。

這似乎是合乎邏輯的,因爲即使在相關的DOM元素(如果有)被UpdatePanel替換之後,您仍然可以保持組件加載。這樣您可以更好地控制組件的使用壽命。我無法想象一個用例,但我相信你可以想出一個用例。

如果我走了,有更好的方法,請讓我知道!