2010-09-01 4 views
0

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

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

  • Разбитое Раствор А:

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

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

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

    Разбитое Раствор B:

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

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

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

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

    +0

    Кнопка «Добавить» должна выполнять свою магическую клиентскую сторону, используя Javascript или jQuery. Код на стороне сервера не будет работать здесь, если вы не намереваетесь совершать кругооборот (т. Е. Отправлять) страницу каждый раз, когда нажимают кнопку «Добавить». –

    +0

    На данный момент, когда он делает ТОЛЬКО после каждой кнопки, это не конец света (пока). Проблема состоит в том, что из-за их жизненного цикла мое лучшее решение состоит в том, чтобы его POST дважды. Если это лучшее, что я могу сделать, это значительный недостаток в планировании ASP.NET, что меня огорчает. – Yerg

    ответ

    0

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

    +0

    На самом деле событие Page_PreInit должно быть лучшим событием для добавления динамических элементов управления. – airmanx86

    Смежные вопросы