ScriptControl внутри UpdatePanel - PullRequest
1 голос
/ 21 октября 2010

У меня есть 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 контроль. Во время асинхронного postbacks, элементы управления UpdatePanel могут быть обновлен, удален или создан. Когда Панель обновлена ​​или удалена, любая распоряжаться сценариями, которые зарегистрированы для элементов управления, которые находятся внутри UpdatePanel называются. В типичном сценарии разработки страниц, вы не должен вызвать RegisterDispose способ.

Просто для двойной проверки я поместил alert("dispose " + this.element.id) внутри своей функции JavaScript dispose(). Каждый экземпляр оповещает dispose GridView_ctl02_MyControl, но после этого я получаю сообщение о том, что два компонента не могут иметь одинаковое имя GridView_ctl02_MyControl. Я в растерянности ...

1 Ответ

1 голос
/ 21 октября 2010

Когда страница выгружается, вызывается метод dispose() моего компонента и также вызывается Sys.Application.removeComponent(). При перезагрузке UpdatePanel вызывается только метод dispose(). Сейчас я решил это, поместив Sys.Application.removeComponent(this); внутрь dispose(). Я не нашел ярлыка, такого как $ remove (похожего на $ create), подразумевая, что вам не нужно это часто.

Это кажется логичным, поскольку вы можете сохранять компонент загруженным даже после замены связанных с ним элементов DOM (если они есть) на UpdatePanel. Таким образом, вы сможете лучше контролировать жизнь компонента. Я не могу представить вариант использования, но я уверен, что вы могли бы придумать один.

Если я далеко и есть лучший подход, пожалуйста, дайте мне знать!

...