#dynamic #controls #postback #viewstate #populate
#динамическая #элементы управления #обратная передача #состояние просмотра #заполнить
Вопрос:
У меня есть разметка в этом формате:-
<asp:UpdatePanel runat="server" id="UpdatePanelList" UpdateMode="conditional">
<ContentTemplate>
<asp:ListView></asp:ListView>
</ContentTemplate>
</asp:UpdatePanel>
<asp:UpdatePanel runat="server" ID="UpdatePanelMain" UpdateMode="Conditional">
<ContentTemplate />
</asp:UpdatePanel>
На этой панели обновления, если запись из базы данных может быть найдена, должен отображаться элемент управления DataGrid (с меткой и выпадающими элементами управления). В противном случае должен отображаться элемент управления HtmlGenericControl DIV с соответствующим сообщением, в котором пользователю предлагается создать запись. Оба этих элемента управления создаются динамически, которые заполняются пользовательскими классами с использованием функций «вывода», таких как «toString».
Если я протестирую операцию с несколькими последовательными элементами управления DataGrid, заполняющими панель обновления, это работает нормально. Аналогично, HtmlGenericControl DIV заполняется, как и ожидалось, также в многократной последовательности.
Однако, когда я тестирую другой тип элемента управления для заполнения панели обновления, это работает в первом экземпляре, но любые дополнительные обратные отправки для заполнения панели обновления завершаются неудачей, и появляется диалоговое окно с запросом:
Failed to load viewstate. The control tree into which viewstate is being
loaded must match the control tree that was used to save viewstate during
the previous request. For example, when adding controls dynamically, the
controls added during a post-back must match the type and position of the
controls added during the initial request.
Меня заставили поверить, что элемент управления UpdatePanel берет на себя управление viewstate в этом экземпляре для динамических элементов управления.
Как мне восстановить viewstate, чтобы разрешить отображение нескольких типов элементов управления в одной панели обновления?
Спасибо.
Ответ №1:
Восстановите все динамические элементы управления (сохраните информацию для этого в ViewState или что-либо другое, что сочтено подходящим) в том же иерархическом порядке, в каком последняя страница была сгенерирована в событиях жизненного цикла «Инициализация» или «Загрузка». Это одно и то же требование для обычной и асинхронной обратной передачи в ASP.NET Веб-формы.
Элементы управления должны быть добавлены — в соответствии с иерархией элементов управления — и затем удалены после события «Load».
Обратитесь к:
- DynamicControlsPlaceHolder, который является готовым элементом управления, помогающим в этом. Здесь также обсуждается, как это работает.
- Динамическая загрузка пользовательских элементов управления ASP NET.