我有一个 ScriptControl (需要 ScriptManager)使用JavaScript处理客户端交互和 ICallbackEventHandler 来回交流。一切都可以与页面上的一个或多个实例完美搭配。我将控件放在一个 GridView 进行分类,并且仍然有效。但是,我把 GridViewUpdatePanel 现在,每当我排序时,我会收到每个实例的以下错误:

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替换。这样,您可以更多地控制组件的生活。我无法想象一个用例,但我敢肯定您可以提出一个用例。

如果我走了,并且有更好的方法,请告诉我!

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top