2009-02-22 4 views
7

Недавно я столкнулся с проблемой при использовании ретранслятора, в который я добавлял динамические элементы управления, и хотя у меня есть обходное решение, которое делает функционально то, что я хочу, d хотел бы знать, есть ли лучший способ сделать это для моего понимания. Я работаю с ASP.NET уже около 6 месяцев, и каждый раз, когда я думаю, что у меня есть жизненный цикл/просмотр, я полностью понял, что что-то появляется, что я не могу ответить.проблема с viewstate динамических элементов управления внутри ретранслятора

Я создавал форму, в которой пользователи могли регистрировать свой интерес к событию и регистрироваться для нескольких людей.

ASPX пошел что-то вроде:

<asp:Repeater ...> 
    <bunch of formatting and always there controls like firstname/lastname/address> 
    <asp:PlaceHolder ...> 
     <dynamic controls for workshop selection go here> 
    </asp:PlaceHolder> 
</asp:Repeater> 

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

В любом случае динамические элементы управления, которые я добавляю, в основном представляют собой кучу литералов и группу групп переключателей.

Я начал с добавления элементов управления в обработчике событий ItemDataBound, но при сохранении элементов репитера в моем списке делегатов ViewState переключателей никогда не обновлялась. Все поля, на которые ссылались в ItemTemplate, обрабатывались отлично, но не переключатели, которые я добавлял динамически.

Я попытался использовать событие ItemCreated вместо этого, добавив туда свои кнопки, но это, похоже, не имеет никакого значения. В конце концов я остановился на обходном пути, который основывался на this. В основном, я просто выводил поля ввода HTML в литерал и читал их обратно из запроса.

Все это прекрасно работает сейчас, и я доволен функциональностью, мне просто кажется, что действительно грязно, чтобы выводить радиокнопки как входы HTML напрямую, а не использовать серверный контроль. Кто-нибудь знает, почему ViewState не восстанавливается должным образом?

Для того, чтобы быть чистым, элементы управления были воссозданы в том же порядке каждый раз, с правильно установленным идентификатором. Я использую динамические элементы управления повсюду, и они работают нормально, я просто не могу заставить их работать в этом случае, когда я добавляю их в ретранслятор.

// дополнительные разъяснения

Я не могу создать эти элементы управления в Page.Init, как пользователь выбирает дату, которая вызывает обратную передачу, и я должен ждать ViewState такого контроля загрузки, прежде чем создать динамические элементы управления.

ответ

5

Вы создаете (или воссоздаете) элементы управления, когда ретранслятор привязан к источнику данных. Если это произойдет после того, как ViewState был загружен страницей, ViewState не будет доступен для динамически созданных элементов управления.

Убедитесь, что вы достаточно долго связываете ретранслятор - Page. Слишком поздно.

+0

Я не могу создать эти элементы управления в Page.Init, когда пользователь выбирает дату, которая вызывает обратную передачу, и я должен дождаться, пока элемент управления этого элемента управления загрузится, прежде чем создавать динамические элементы управления. Кроме того, Page_Load еще не слишком поздно, ASP.NET должен пропустить весь жизненный цикл страницы ... –

+0

... при добавлении нового элемента управления. По крайней мере, я думал, это должно было случиться. Я могу добавить динамические элементы управления в page_load и заставить его работать, только когда они находятся в репитере. –

0

Следует отметить, что элементы управления Radiobuttons не работают «из коробки» в элементах управления ретрансляторами. Элементы управления Repeater наследуют интерфейс INamingContainer, который гарантирует, что все визуализированные элементы управления html имеют уникальные атрибуты имени. Поскольку радиокнопки используют атрибут name для группировки, это означает, что вы не сможете создавать группы переключателей, т. Е. Установка свойства GroupName не будет иметь желаемого эффекта, поскольку Repeater переопределит это и создаст уникальные имена для каждого RadioButton.

+0

Да, я знаю это, поэтому я, вероятно, должен будет использовать свое обходное решение независимо. Я просто очень хочу знать, почему я не могу заставить viewstate работать. –

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