scriptControl Infordpanel内部
-
10-10-2019 - |
题
我有一个 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
不处理旧 Sys.UI.Control
试图之前的对象 $create()
具有相同ID的新版本。我以为 UpdatePanel
/ScriptManager
组合会自动照顾处置将要替换的物体吗?
编辑: 此页面似乎支持我的想法: http://msdn.microsoft.com/en-us/library/system.web.ui.scriptmanager.registerdispose.aspx
使用registerDispose方法将脚本登记为“更新”控件内部的控件。在异步后返回过程中,可以更新,删除或创建更新PANEL控件。 当面板更新或删除面板时,调用了在UpdatePanel内部注册的控件的任何处置脚本。在典型的页面开发方案中,您不必调用registerDispose方法。
只是为了仔细检查我放置了一个 alert("dispose " + this.element.id)
在我的JavaScript内部 dispose()
功能。每个实例警报 dispose GridView_ctl02_MyControl
, ,但是之后我得到的错误是两个组件不能具有相同的名称 GridView_ctl02_MyControl
. 。我茫然...
解决方案
当页面卸载时,我的组件的 dispose()
方法称为 Sys.Application.removeComponent()
也称为。当。。。的时候 UpdatePanel
仅重新加载 dispose()
方法被调用。现在,我已经通过放置了 Sys.Application.removeComponent(this);
在 - 的里面 dispose()
. 。我没有找到诸如$ emove(类似于$ create)之类的快捷方式,这意味着您不希望经常需要此捷径。
这似乎是合乎逻辑的,因为您可以将组件加载到相关的DOM元素后(如果有)被UpdatePanel替换。这样,您可以更多地控制组件的生活。我无法想象一个用例,但我敢肯定您可以提出一个用例。
如果我走了,并且有更好的方法,请告诉我!