我有一个ScriptControl (需要ScriptManager)和JavaScript来处理客户端交互,ICallbackEventHandler可以来回通信。所有这些都与页面上控件的一个或多个实例完美地工作。我将控件放在带有排序的GridView中,它仍然有效。但是,我将GridView放在一个UpdatePanel中,现在每当我对每个实例进行排序时,我都会得到以下错误:
Sys.InvalidOperationException: Two components with the same id 'GridView_ctl02_MyControl' can't be added to the application.
有人能为我指明解决问题的正确方向吗?我假设ScriptManager在尝试使用相同ID的新对象之前并不是在释放旧的Sys.UI.Control对象,我认为UpdatePanel/ScriptManager组合会自动处理将要替换的对象?
编辑:这个页面似乎支持我的想法:http://msdn.microsoft.com/en-us/library/system.web.ui.scriptmanager.registerdispose.aspx
使用RegisterDispose方法为位于UpdatePanel控件内的控件注册dispose脚本。在异步回发期间,可以更新、删除或创建UpdatePanel控件。在更新或删除面板时,将调用为UpdatePanel中的控件注册的任何dispose脚本。在典型的页面开发场景中,您不必调用RegisterDispose方法.。
为了再次检查,我在我的JavaScript dispose()函数中放置了一个dispose()。每个实例都警告dispose GridView_ctl02_MyControl,但之后我得到两个组件不能具有相同名称的GridView_ctl02_MyControl的错误。我不知所措..。
发布于 2010-10-21 18:01:49
当页面卸载时,调用我的组件的dispose()方法,并调用Sys.Application.removeComponent()。当UpdatePanel重新加载时,只调用dispose()方法。现在,我已经通过将Sys.Application.removeComponent(this);放在dispose()中解决了这个问题。我没有找到像$remove这样的快捷方式(类似于$create),这意味着您不需要经常这样做。
这似乎是合乎逻辑的,因为您可以在组件的相关DOM元素(如果有的话)被UpdatePanel替换后仍然加载它。这样,您就可以更好地控制组件的生命。我无法想象用例,但我相信你能想出一个用例。
如果我离得很远,有更好的方法,请告诉我!
https://stackoverflow.com/questions/3989841
复制相似问题