Элементы управления ASP.NET и панели обновления

Я создаю серию элементов управления клиентскими компонентами на лету, которые вложены в панель обновлений. В первый раз, когда я создаю элементы управления, все работает так, как нужно, однако, когда я запускаю обновление на панели обновлений и выполняю частичную обратную передачу, элементы управления возвращаются с несколькими ошибками javascript, описывающими, как элемент управления уже зарегистрирован на странице.

Я получаю серию ошибок, которые говорят что-то вроде: «Ошибка: Sys.InvalidOperationException: два компонента с одинаковым идентификатором« master_ctl40_CCB_PALETTES »не могут быть добавлены в приложение»

Есть какие-нибудь идеи?


person Community    schedule 19.02.2009    source источник
comment
Похоже, вы дважды пытаетесь создать элементы управления. Сможете ли вы опубликовать свой код обновления? Где вы создаете элементы управления?   -  person jgallant    schedule 19.02.2009


Ответы (3)


Попробуйте эти уловки:

  1. На Page_Load поместите uxFailedControl.ID = DateTime.Now.ToString (); Это гарантирует, что ваш элемент управления будет иметь уникальный идентификатор каждый раз при перезагрузке страницы (полностью или частично), поэтому теоретически вы больше не должны видеть ошибок типа «одинаковый идентификатор».
  2. Если вы отображаете свой элемент управления в модальном всплывающем окне: каждый раз, когда вы скрываете всплывающее окно с сервера, удаляйте элемент управления из его контейнера (панель, страница, элемент управления и т. Д.). Используйте uxModalPopupPanel.Controls.Clear (); или uxModalPopupPanel.Remove (uxFailedControl);
  3. Когда вы закончите отладку, установите для свойства ScriptMode вашего ScriptManager значение «Release». Это предотвратит передачу внутренних исключений AJAX браузеру.
person Alex    schedule 26.03.2009
comment
Создание уникальных идентификаторов с DateTime.Now.ToString() решило мои проблемы. - person Rubens Mariuzzo; 06.03.2012

В каком случае вы добавляете компоненты на панель обновлений? Т.е. поместили ли вы их в событие загрузки страницы без проверки обратной передачи или поместили ли вы в событие загрузки панели обновления? и т.д...

person REA_ANDREW    schedule 19.02.2009
comment
Да, я добавляю их в событие Page_Load, однако, если я скажу if (! Page.IsPostBack), то после этого элементы управления не будут обновлены и отправлены клиенту. - person ; 19.02.2009
comment
Не могли бы вы попробовать добавить свой элемент управления в событие Page_Init и удалить блок кода IsPostBack, пожалуйста. - person REA_ANDREW; 20.02.2009

Похоже, ваш клиентский объект создается более одного раза.

Если вы хотите, чтобы элементы управления на стороне клиента заменялись при обновлении панели обновления, они должны быть унаследованы от Sys.UI.Control, который принимает элемент в своем конструкторе. Когда этот элемент заменяется панелью обновлений, клиентский объект удаляется, а затем создается заново. Если вы в настоящее время используете ScriptComponentDescriptor на стороне сервера для определения экземпляра клиентского элемента управления, вам нужно переключиться на ScriptControlDescriptor.

Судя по всему, ваши клиентские объекты просто наследуются от Sys.Component, который будет зависать до тех пор, пока не будет удален вручную, поэтому вы получаете сообщение об ошибке, что у вас есть более одного компонента с одним и тем же идентификатором.

Я бы посоветовал не использовать новый идентификатор при каждой обратной публикации - это просто продолжит создавать новые клиентские объекты, не очищая старые.

person frizz    schedule 26.05.2009