Я работаю над приложением типа анкеты, в котором вопросы хранятся в базе данных. Поэтому я создаю свои элементы управления динамически на каждом Page.OnLoad.
Это работает как чудо, и ViewState сохраняется между постбэками, потому что я гарантирую, что мои динамические элементы управления всегда имеют один и тот же сгенерированный Control.ID.
В дополнение к пользовательскому элементу управления, который динамически заполняет вопросы, моя страница вопросника также содержит раздел «Статус» (также инкапсулированный пользовательским элементом управления), который представляет состояние вопросника (варианты «Завершено», «Запущено»). или «В процессе»). Если пользователь меняет статус анкеты (то есть с «Выполняется» на «Завершено»), мне необходимо выполнить обратную передачу на сервер, поскольку содержимое динамической части анкеты зависит от выбранного статуса.
Некоторые вопросы всегда присутствуют независимо от статуса, а другие могут не присутствовать вообще для выбранного статуса. Дело в том, что, когда статус меняется, я должен вернуться на страницу и задать правильный набор вопросов. Кроме того, мне нужно сохранить любые введенные пользователем значения для тех вопросов, которые «всегда доступны».
Однако из-за жизненного цикла страницы в ASP.NET OnLoad пользовательского элемента управления «Статус», который содержит правильный статус, необходимый для загрузки нужных вопросов из БД, не выполняется до тех пор, пока не будут выполнены «динамические вопросы». 'пользовательский элемент управления уже заполнен (с неправильными / устаревшими значениями).
Чтобы обойти это, я поднимаю событие с моего пользовательского элемента управления «Статус» на главную страницу, чтобы указать, что Статус изменился. Затем на главной странице возникает событие в пользовательском элементе управления «динамические вопросы». Поскольку к тому времени, когда это событие всплывает, пользовательский элемент управления «динамические вопросы» уже загрузил «неправильные» вопросы из БД, он сначала вызывает Controls.Clear. Затем он с радостью использует новый статус для запроса «правильных» вопросов к базе данных и выполняет Control.Add () для каждого. К вашему сведению, Control.IDs одинаковы для всех постбэков.
Это решение работает ... Сорта. Правильный набор вопросов для выбранного статуса будет оказан; однако ViewState теряется для этих «всегда доступных» вопросов. Я предполагаю, что это потому, что пользовательский элемент управления «динамические вопросы» вызывает Controls.Clear при ответе на событие изменения статуса. Это должно как-то уничтожить связь между ViewState и моими динамическими элементами управления, даже если Control.ID совпадают.
Это кажется таким распространенным требованием, я практически уверен, что есть лучший, более чистый и менее подверженный ошибкам подход для достижения этой цели. В случае, если это не совсем очевидно, я не смог получить жизненный цикл страницы ASP.NET, несмотря на работу с ним в течение последнего года. Любая помощь очень ценится!