Проблема состояния представления пользовательского элемента управления asp.net 2.0 - PullRequest
1 голос
/ 23 декабря 2009

У меня есть пользовательский элемент управления, в котором есть элемент управления RadioButtonList. При выборе одной из переключателей элемент управления выполняет обратную передачу, чтобы выполнить некоторую работу на стороне сервера, и страница перезагружается с выбранной правильной кнопкой. Это нормально работает на моей тестовой странице.

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

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

Приветствия

Адендум - немного больше информации

Спасибо за совет, Стивен

Элемент управления изначально разрабатывался как пользовательский веб-элемент управления, использующий конструктор, очень простую реализацию, обработчики на стороне сервера для загрузки и при изменении выбора радиокнопок. Отдельная dll для кода позади и ascx. Затем я преобразовал его в пользовательский элемент управления, чтобы вытянуть ascx в dll с скомпилированным кодом позади.

Я не создаю динамически элемент управления на тестовой странице, для этого есть тег и <% @ Register ... бла-бла> вверху в aspx. Список радиообращений был перетащен в ascx с помощью дизайнера, поэтому я не реализовал код для его создания. Так что все очень ванильно. Я действительно ищу различия, на которые мне следует обратить внимание на страницах, использующих элемент управления, чтобы понять, почему он работает на тестовой странице, а не на странице сайта, в которой он должен находиться.

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

*********** Ответ ************* Вот ответ от разработчика, который вступил во владение.

Ваш элемент управления тестом был в порядке, причина, по которой значения не сохранялись при обратной передаче, была из-за унаследованной функциональности в базовом классе при запуске. По сути, он сделал DataBind в методе загрузки страницы, который в жизненном цикле страницы находится до вызова методов обратной передачи, поэтому он сбрасывал значения раскрывающихся списков. В конце я установил некоторые свойства viewstate, которые содержали значения выпадающих. Так что это было не то, о чем ты мог знать.

Ответы [ 4 ]

2 голосов
/ 23 декабря 2009

Во-первых, это НЕ проблема ViewState. Viewstate - для программных изменений элементов управления на странице. Если вы устанавливаете текст метки в нечто отличное от того, что находится в ASPX в CODE BEHIND, тогда это значение сохраняется в viewstate. .NET имеет механизм (и он управляется через интерфейс, который должен реализовать ваш элемент управления), который анализирует данные POST обратно в элементы управления, к которым они принадлежат, что происходит после загрузки ViewState, но до того, как сработает событие Page_Load.

Теперь есть несколько разных причин по этим причинам:

Во-первых, это радио-кнопка внутри вашего пользовательского элемента управления генерируется внутри метода CreateControls или это прямой HTML, который ваш элемент управления отображает? Если это прямой HTML, то вам нужно убедиться, что вы обрабатываете ожидаемые значения, когда они возвращаются из обратной передачи. Если это серверный элемент управления, объявленный как НОВЫЙ в вашем пользовательском элементе управления, который не был создан и обработан в методе CreateControls, то вам нужно mvoe там.

Второй - это элемент управления на странице ASPX или он добавляется на страницу в коде позади. Если он добавляется на страницу в коде позади, вероятно, он добавляется после того, как парсер .NET завершил передачу данных обратной передачи. Проверьте свою коллекцию форм, чтобы увидеть, существует ли там значение.

2 голосов
/ 23 декабря 2009

Убедитесь, что на вашей странице есть

EnableViewState=True
0 голосов
/ 24 февраля 2010

Получил ответ от разработчика, который принял проект ->

"Ваш элемент управления викториной был в порядке, причина, по которой значения не сохранялись при обратной передаче, была из-за унаследованной функциональности в базовом классе при его запуске. По сути, он сделал DataBind в методе загрузки страницы, который в Жизненный цикл страницы происходит до вызова методов обратной передачи, поэтому он сбрасывает значения раскрывающихся списков. В конце я настроил некоторые свойства представления состояния, которые содержали значения раскрывающихся списков. Поэтому вы не могли об этом знать. "

Надеюсь, это кому-нибудь поможет.

0 голосов
/ 23 декабря 2009

В прошлый раз, когда мне нужно было использовать ViewState для переключателя, мне пришлось переопределить методы LoadViewState и SaveViewState, чтобы заставить его работать правильно.

...