Дихотомия жизненного цикла ASP.NET: динамически добавленные элементы управления и события - PullRequest
0 голосов
/ 02 сентября 2010

Ситуация:

У меня есть пользовательские элементы управления с кнопками, которые перехватывают события. Элементы управления с событиями должны быть инициализированы в Page_Load или ранее. Я хочу динамически создавать эти пользовательские элементы управления, нажимая кнопку Добавить. Важно помнить, что такие события, как события щелчка, не запускаются, пока не будет перед Page_LoadComplete.

Неисправное решение A:

  1. Page_Load: динамически создать кнопку «Добавить», событие щелчка мыши.
  2. Пользователь нажимает кнопку Добавить, запускает обратную передачу.
  3. Page_Load: как обычно, создает кнопку «Добавить» и перехватывает событие щелчка.
  4. Page_Load: Не знает, что кнопка «Добавить» была нажата, поэтому он не знает, чтобы вызвать пользовательский элемент управления!
  5. AddButton_Click: Страница наконец осознает, что новый пользовательский элемент управления должен быть добавлен при следующей загрузке страницы.
  6. Пользователь не может видеть элемент управления, который он добавил, потому что был запущен другой Page_Load.
  7. Пользователь перезагружает страницу, нажимая кнопку, обновляя страницу и т. Д.
  8. Page_Load: создает кнопку «Добавить» и перехватывает событие клика. Теперь известно о добавленном пользовательском контроле, создает пользовательский контроль. Перехватывает события в пользовательском элементе управления.
  9. Пользователь нажимает на кнопку в пользовательском управлении, срабатывает просто отлично.

Результат: пользователь нажал кнопку Добавить новый пользовательский элемент управления, сервер знает, что элемент управления должен существовать, но пользователь не увидит его, пока не запустит страницу для повторной загрузки (путем нажатия другой кнопки или обновления или т. ).

Естественно, я взглянул на жизненный цикл и увидел, что Page_LoadComplete происходит после событий, поэтому, если я помещу какой-либо код, зависящий от события, в Page_LoadComplete, все должно быть хорошо?

Сломанный раствор B:

  1. Page_LoadComplete: динамически создать кнопку «Добавить», перехватить событие щелчка.
  2. Пользователь нажимает кнопку Добавить, запускает обратную передачу.
  3. Page_LoadComplete: как обычно, создает кнопку «Добавить» и перехватывает событие щелчка.
  4. AddButton_Click: Страница знает, что при следующем Page_LoadComplete должен быть добавлен новый пользовательский элемент управления.
  5. Page_LoadComplete: Зная о нажатии кнопки, динамически добавляет элемент управления со своим собственным внутренним событием нажатия кнопки.
  6. Пользователь нажимает кнопку в добавленном пользовательском элементе управления, но она не срабатывает !!

Результат: все отлично работает, кроме кнопки в добавленном пользовательском элементе управления, инертной.

Загадка: мне нужны элементы управления, вызываемые нажатием кнопки, что означает, что мне нужно поместить свой код Controls.Add(...) в Page_LoadComplete. И наоборот, мне нужно, чтобы добавляемые элементы управления имели рабочие события, а это значит, что код Controls.Add(...) должен быть в Page_Load. У меня идеальная дихотомия.

Единственное неопрятное решение, о котором я могу подумать, - это принять решение A и принудительно перезагрузить страницу после нажатия кнопки «Добавить», что является пустой тратой пропускной способности и обработки.

1 Ответ

0 голосов
/ 02 сентября 2010

Возможно, это не лучшая практика, но вы можете проверить Request.Form для подтверждения нажатия кнопки добавления во время события Page_Init и добавить туда элементы управления.Это должно решить вашу проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...