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

Ситуация:

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

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

    1. Page_Load: динамически создавать кнопку «Добавить», событие щелчка.
    2. Пользователь нажимает кнопку «Добавить», запускается обратная передача.
    3. Page_Load: создает кнопку «Добавить» как обычно и перехватывает событие щелчка.
    4. Page_Load: не знает, что кнопка "Добавить" еще была нажата, поэтому не знает, как создать пользовательский элемент управления!
    5. AddButton_Click: страница наконец узнала, что новый пользовательский элемент управления должен быть добавлен при следующей загрузке Page_Load.
    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. У меня идеальная дихотомия.

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


    person Yerg    schedule 01.09.2010    source источник
    comment
    Ваша кнопка «Добавить» должна выполнять свою магическую работу на стороне клиента, используя Javascript или jQuery. Серверный код здесь не будет работать, если вы не собираетесь возвращать страницу туда и обратно (например, публиковать) каждый раз, когда они нажимают кнопку Добавить.   -  person Robert Harvey    schedule 02.09.2010
    comment
    На данный момент отправка POST один раз при каждом нажатии кнопки - это еще не конец света (пока). Проблема в том, что из-за их жизненного цикла лучшее решение - дважды выполнить POST. Если это лучшее, что я могу сделать, это серьезный изъян в планировании ASP.NET, который меня огорчает.   -  person Yerg    schedule 02.09.2010


    Ответы (1)


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

    person airmanx86    schedule 01.09.2010
    comment
    Фактически, событие Page_PreInit должно быть лучшим событием для добавления динамических элементов управления. - person airmanx86; 02.09.2010