Как обновить данные страницы после обработки события?

На Page_Init я создаю таблицу динамически создаваемых элементов управления на основе пары таблиц базы данных. Одним из элементов управления является ImageButton для перемещения элемента списка вверх. Этот обработчик событий обновляет столбец SortOrder в базе данных для затронутых элементов.

Теперь проблема в том, что поскольку элементы управления создаются в событии Page_Init, а SortOrder обновляется позже, когда запускается командное событие ImageButton. Какая наилучшая процедура для обновления таблицы с правильным SortOrder. Если я воссоздаю таблицу после того, как событие сработало, событие команды ImageButton больше не будет работать.

  • Следует ли мне реализовать метод обновления данных в таблице без ее воссоздания?
  • Должен ли я перезагружать страницу в коде после срабатывания события?

Какой способ решения этой проблемы вы предпочитаете?


person Joakim Karlsson    schedule 23.04.2009    source источник


Ответы (3)


Такие события страницы, как Init и Load, всегда будут запускаться перед обработчиком событий, вызвавшим обратную передачу. Это основа жизненного цикла страницы (для визуального представления Питер Бромберг, см. Здесь). Большинство разработчиков, плохо знакомых с ASP.NET, сталкиваются с серьезными проблемами в понимании этого «затруднительного положения» и его правильном решении.

Идеальный способ сделать это:

а. Ваш Page_Init должен вызвать процедуру (назовем ее BindData() для иллюстрации), которая обрабатывает создание таблицы на основе данных базы данных. Этот метод был бы похож на метод привязки, который привязывается к данным базы данных и отображает элементы пользовательского интерфейса на основе этой привязки. IOW, вы должны удалить код создания таблицы из метода Page_Init и поместить его в отдельный метод, чтобы его можно было вызывать при необходимости.

Важное примечание. Этот BindData() метод также обрабатывает присоединение обработчика событий для динамически создаваемого элемента управления ImageButton к элементу управления. Мы назовем это ImageButton_Click. Это очень важно для управления событием, которое запускается при последующей обратной передаче.

б. Когда ваш ImageButton_Click метод выполняется, он вызывает метод BindData() для воссоздания таблицы и ее привязок, но с новыми правилами порядка сортировки.

Итак, порядок выполнения при первой загрузке:

  1. Page_Init
  2. BindData()

Порядок выполнения при последующих загрузках (при обратной передаче):

  1. Page_Init
  2. BindData() - Обработчик событий для ImageButton прикреплен.
  3. ImageButton_Click
  4. BindData()
person Cerebrus    schedule 23.04.2009

Вам понадобится что-то вроде этого ...

  • OnInit (IsPostBack = false)
    • Dynamically create ImageButton
    • Обработчик событий Wireup ImageButton
    • Загрузить таблицу - проверьте порядок сортировки в сеансе / переменной. Если нет; использовать значение по умолчанию

Нажмите кнопку

  • OnInit (IsPostBack = true / 1-й постбэк)

    • Dynamically re-create ImageButton
    • Обработчик событий Wireup ImageButton
    • Загрузить таблицу - с порядком сортировки по умолчанию
  • ImageButton_OnClick (все тот же первый постбэк)

    • Reload Table - with specific sort order
    • Сохраните эту переменную порядка сортировки в переменной Viewstate / Session

Вызовите другую обратную передачу

  • OnInit (IsPostBack = true / 2nd & Subsequent Postbacks)
    • Dynamically create ImageButton
    • Обработчик событий Wireup ImageButton
    • Загрузить таблицу - проверьте порядок сортировки в сеансе / переменной. Если НАЙДЕНО, используйте это.
person Eoin Campbell    schedule 23.04.2009
comment
Что там говорят о Великих Разумах ;-) - person Eoin Campbell; 23.04.2009

Во-первых, вы, кажется, вручную привязываете свои данные к элементам управления пользовательского интерфейса. В Asp.Net есть много способов избежать этого, используя встроенные методы привязки данных. Многие элементы управления, такие как GridView, позволяют автоматически создавать таблицы Html из заданного источника данных. Есть много других вариантов, включая ретрансляторы.

Как бы вы ни выбрали привязку данных, методика состоит в том, чтобы в какой-то момент каждый раз в течение жизненного цикла страницы выполнять повторную привязку.

Тебе надо...

  1. Свяжите ваши данные при загрузке первой страницы с порядком сортировки по умолчанию
  2. Повторно привяжите данные в обработчике событий кнопки изображения после изменения порядка сортировки.

Код будет выглядеть примерно так ...

private void Page_Load (...)
{
    if (!IsPostBack)
        //On First Load
        BindData(defaultSoortOrder);
    else
        BindData(currentSortOrder);            
}

private void ImageButton_Click (...)
{
    currentSortOrder = newSortOrder;
    BindData(currentSortOrder);
}

Если нажать кнопку «Изображение», вы дважды вызовете BindData. Но это необходимо, поскольку обратная передача страницы может быть инициирована из любого элемента управления, вам всегда нужно обеспечивать привязку данных при загрузке страницы.

person Andy McCluggage    schedule 23.04.2009