ScriptControl внутри UpdatePanel
У меня есть 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()
новые с таким же идентификатором. Я думал UpdatePanel
/ ScriptManager
Комбинация автоматически позаботится об утилизации предметов, которые будут заменены?
Изменить: эта страница, кажется, поддерживает то, что я думал: http://msdn.microsoft.com/en-us/library/system.web.ui.scriptmanager.registerdispose.aspx
Используйте метод RegisterDispose, чтобы зарегистрировать сценарии удаления для элементов управления, которые находятся внутри элемента управления UpdatePanel. Во время асинхронных обратных передач элементы управления UpdatePanel могут быть обновлены, удалены или созданы. Когда панель обновляется или удаляется, вызываются все сценарии удаления, зарегистрированные для элементов управления внутри UpdatePanel. В типичных сценариях разработки страниц вам не нужно вызывать метод RegisterDispose.
Просто чтобы проверить, я поместил alert("dispose " + this.element.id)
внутри моего JavaScript dispose()
функция. Каждый экземпляр оповещения dispose GridView_ctl02_MyControl
, но потом я получаю сообщение об ошибке, что два компонента не могут иметь одинаковое имя GridView_ctl02_MyControl
, Я в недоумении...
1 ответ
Когда страница выгружается, мой компонент dispose()
метод называется и Sys.Application.removeComponent()
также называется. Когда UpdatePanel
только перезагрузки dispose()
метод называется. Сейчас я решил это, поставив Sys.Application.removeComponent(this);
внутри dispose()
, Я не нашел ярлык, такой как $remove (похожий на $create), подразумевая, что вам не нужно это часто.
Это кажется логичным, поскольку вы можете сохранять компонент загруженным даже после замены связанных с ним элементов DOM (если они есть) на UpdatePanel. Таким образом, вы сможете лучше контролировать жизнь компонента. Я не могу представить вариант использования, но я уверен, что вы могли бы придумать один.
Если я далеко и есть лучший подход, пожалуйста, дайте мне знать!