2010-10-21 4 views
1

У меня есть ScriptControl (требуется ScriptManager) с JavaScript для обработки взаимодействий на стороне клиента и ICallbackEventHandler для связи взад и вперед. Все работает отлично с одним или несколькими экземплярами элемента управления на странице. Я поместил элемент управления в GridView с сортировкой, и он все еще работает. Тем не менее, я поместить GridView в UpdatePanel и теперь всякий раз, когда я сортирую я получаю следующее сообщение об ошибке для каждого экземпляра:ScriptControl внутри 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 автоматически позаботится об утилизации объектов, которые будут заменены?

Edit: Эта страница появляется, чтобы поддержать то, что я подумал: http://msdn.microsoft.com/en-us/library/system.web.ui.scriptmanager.registerdispose.aspx

Используйте метод RegisterDispose для регистра выбрасывайте скрипты для управления , которые внутри UpdatePanel управления. Во время асинхронных postbacks элементы управления UpdatePanel могут быть обновлены, удалены или созданы. Когда панель обновляется или удаляется, любые выписывают скрипты, зарегистрированные для элементов управления, находящихся внутри 0 Update. В типичных сценариях разработки вы не должны вызывать метод 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. Таким образом, вы больше контролируете жизнь компонента. Я не могу представить вариант использования, но я уверен, что вы могли бы придумать его.

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

Смежные вопросы