Как обновить данные страницы после обработки события? - PullRequest
3 голосов
/ 23 апреля 2009

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

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

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

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

Ответы [ 3 ]

8 голосов
/ 23 апреля 2009

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

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

а. Ваш Page_Init должен вызвать процедуру (назовем ее BindData() для иллюстрации), которая обрабатывает создание таблицы на основе данных базы данных. Этот метод будет похож на метод привязки, который связывается с данными базы данных и отображает элементы пользовательского интерфейса на основе этой привязки. Итак, вы должны удалить код создания таблицы из метода 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()
4 голосов
/ 23 апреля 2009

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

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

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

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

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

    • Таблица перезагрузки - с определенным порядком сортировки
    • Сохраните эту переменную порядка сортировки в переменной Viewstate / Session

Причина какой-то другой обратной передачи

  • OnInit (IsPostBack = true / 2nd & Последующие обратные передачи)
    • Динамически создавать ImageButton
    • Обработчик события Wireup ImageButton
    • Загрузить таблицу - Проверьте порядок сортировки в сеансе / переменной. Если НАЙДЕН, используйте это.
1 голос
/ 23 апреля 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. Но это необходимо, поскольку постбэк страницы может быть инициирован из любого элемента управления, вам всегда нужно связывать данные при загрузке страницы.

...