1

我有一个ScriptControl(需要ScriptManager)用 JavaScript 来处理客户端交互ICallbackEventHandler和来回通信。一切都与页面上的一个或多个控件实例完美配合。我将控件放在GridView带有排序的 a 中,它仍然可以工作。但是,我将其GridView放入 an 中UpdatePanel,现在每当我排序时,每个实例都会出现以下错误:

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,但之后我收到两个组件不能具有相同名称的错误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 回答