asp.net устанавливает сессии перед обратной передачей - PullRequest
0 голосов
/ 23 ноября 2011

Есть ли простой способ хранить все необходимые глобальные переменные сразу в сессиях до запуска PostBack? Или я должен хранить их на каждом шаге, где я меняю их? Я сделаю что-то вроде:

// Global variable.
bool test = true;

// Store all needed information in a session.
protected void Before_globalvariable_is_set_to_default_value(...)
{
    Session["Test"] = test;
    ...
}

protected void Page_Load(object sender, EventArgs e)
{
    if(IsPostBack)
    {
        //if(Session["Test"] != null)
        //{
            test = (bool)Session["Test"];
            Session.Contents.Remove("Test");
        //}
    }
}

Возможно ли что-то подобное?

Дополнительная информация

На Page_Load (!IsPostBack) я проверяю, получает ли пользователь больше видения, если он получает, я устанавливаю глобальную переменную в true. Позже в моем коде я проверяю, верна ли эта переменная, и добавляю дополнительные столбцы в GridView. Теперь, если PostBack происходит, я не могу проверить эту переменную, потому что я теряю информацию. Я знал, что мне нужно хранить информацию в Session. Если я установлю Session в то время, когда для глобальной переменной задано значение true, у меня возникнут проблемы с тайм-аутом сеанса (если пользователь находится на сайте, но какое-то время ничего не делает). Поэтому я подумал, что будет хорошо, если я установлю Session незадолго до того, как потеряю информацию о глобальном var, и удаляю Session после повторной инициализации.

Это моя идея, но я не знаю, возможно ли что-то подобное.

Edit2: Если я сделаю следующее, это сработает:

//Global variable
bool test = false;

protected void Page_PreRender(object sender, EventArgs e)
{
    Session["Test"] = test;
}

protected void Page_Load(object sender, EventArgs e)
{
    if (IsPostBack)
    {
        test = (bool)Session["Test"]; // Session is true!!!
        Session.Contents.Remove("Test");
    }
    else
    {
        test = true; // Set at the PageLoad the var to true.
    }
}

Я немного сбит с толку, я думал PreRender - это после PageLoad, почему вдруг тестовая переменная верна, и если я уберу PreRender, это не так?

Greetz

Ответы [ 2 ]

1 голос
/ 23 ноября 2011

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

1 голос
/ 23 ноября 2011

Если значение должно сохраняться только во время этого одного запроса, вы можете использовать поля уровня класса класса code-behind. Установите их на этапе инициализации или загрузки, затем эти значения можно использовать на всех других этапах.

На всю жизнь всего один запрос:

public partial class MyPage: Page
{
   private bool test = true;

   public void Page_Load(...)
   {
      // maybe set 'test' to another value
   }

   public void Button_Click(...)
   {
      // you can still access 'test'
   }

   public void Page_PreRender(...)
   {
      // you can still access 'test'
   }
}

Если, однако, вам нужно, чтобы это значение соответствовало запросу от обратной передачи next , вы можете использовать ViewState вместо Session. Преимущество : нет тайм-аута, поскольку он хранится в html и отправляется обратно из браузера вместе с другими данными. Недостаток : он работает только в пост-сканарио, а не при ссылке на другую страницу.

...