2010-10-21 46 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替换之后,您仍然可以保持组件加载。这样您可以更好地控制组件的使用寿命。我无法想象一个用例,但我相信你可以想出一个用例。

如果我走了,有更好的方法,请让我知道!