首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ScriptControl内部UpdatePanel

ScriptControl内部UpdatePanel
EN

Stack Overflow用户
提问于 2010-10-21 16:44:40
回答 1查看 1.5K关注 0票数 1

我有一个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的错误。我不知所措..。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2010-10-21 18:01:49

当页面卸载时,调用我的组件的dispose()方法,并调用Sys.Application.removeComponent()。当UpdatePanel重新加载时,只调用dispose()方法。现在,我已经通过将Sys.Application.removeComponent(this);放在dispose()中解决了这个问题。我没有找到像$remove这样的快捷方式(类似于$create),这意味着您不需要经常这样做。

这似乎是合乎逻辑的,因为您可以在组件的相关DOM元素(如果有的话)被UpdatePanel替换后仍然加载它。这样,您就可以更好地控制组件的生命。我无法想象用例,但我相信你能想出一个用例。

如果我离得很远,有更好的方法,请告诉我!

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3989841

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档