Вопрос

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

Просто чтобы дважды проверить, я положил 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(). Анкет Я не нашел ярлык, такой как $ remove (аналогично $ create), подразумевая, что вы не ожидаете этого часто.

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top