2012-07-04 7 views
2

Я работаю с общим списком на простой странице, содержащей пользовательский элемент управления.Button_click before Page_load

Я заполняю этот список, используя переменную сеанса. Эта переменная сеанса устанавливается в моем событии Button_click.

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

И наконец, мой общий список не обновляется, потому что переменная сеанса устанавливается после page_load.

EDIT: Моя переменная сеанса настроена в функции, обработанной делегатом, при нажатии кнопки моего User Control.

Есть ли решение предотвратить это? Есть ли решение сохранить ценность этого списка по сравнению с многопользовательской обратной связью с использованием переменной сеанса?

Спасибо за вашу помощь,

Квентина

ответ

1

Я нахожу решение: мне нужно переопределить функцию Pre_render на главной странице. Действительно, жизненный цикл: Page_load-> Button_click-> Page_PreRender.

Так что в моей функции Pre_render я могу настроить переменную сеанса и использовать его так, как я хочу.

Из того, что я понял, событие Pre_Render часто используется для инициализации значений элементов управления непосредственно перед их отображением на странице.

Благодарим за помощь.

1

В замковой случае, вы должны сделать три вещи:

  1. Сохранить общий список на сессию.
  2. Сохраните флаг cookie как флаг (может быть значением сеанса), сигнализируя, что список сохранен.
  3. Resonse.Redirect(Request.RawURL) Перенаправление на ту же страницу.

И в случае Page_Load вы должны сделать что-то вроде этого:

protected void Page_Load(object sender, EventArgs e) 
{ 
    if (!IsPostBack) 
    { 
     if (Session["MyFlag"] != null) 
     { 
      //Perform whatever you need to do with your already saved generic list in Session 
      Session["MyFlag"] = null; 
     } 
    } 
} 

Если вам нужно хранить сложный объект, как общий список через постбэков Session является вашим другом. Если вам нужно сохранить только значение, вы можете использовать cookie или ASP.HiddenField, но для этого вам лучше использовать Session.

+1

Привет, ваше решение кажется хорошим. Однако это вызовет другие проблемы. В противном случае все другие переменные, введенные пользователем в виде главной страницы, будут забыты с помощью Response.Redirect. – Quentin91360

0

Почему вы не установить сеанс внутри:

if(!IsPostback) 
{ 
    // your session setting here (or method) 
} 

Так будет держать значение через постбэка без установки его с каждым постбэка.

Также вы можете объявить метод, который вы можете легко вызвать из IsPostback или вашего события cick.

0

Вы также можете попробовать переместить свой код из Page_Load в Page_PreRender, который будет срабатывать после нажатия кнопки мыши. Это должно решить проблему, которую вы имеете.

+0

Нет, если созданы элементы управления, такие как LinkButtons. –

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