Context.Items очищается при обновлении / переносе страницы - PullRequest
2 голосов
/ 04 ноября 2010

Я работаю над проектом класса и столкнулся с проблемой, которую не могу понять.У меня такое ощущение, что на самом деле это довольно легко, но я так долго работаю над вещами, что больше не могу думать прямо.

У меня есть страница входа, которая позволяет пользователю войти в систему и передать 2 элемента данныхследующая страница с использованием Context.Items и Server.Transfer.Вот фрагмент кода:

Context.Items["preferred"] = true;
Context.Items["pageNum"] = 1;
Server.Transfer("ProductsShelf.aspx");

На странице "ProductsShelf" я могу получить доступ к этим двум элементам и использовать данные следующим образом:

pageNumber = (int)Context.Items["pageNum"];

Затем я использую переключательоператор с pageNumber для отображения определенной информации:

switch (pageNumber)
{
    case 1:
        imgProd.ImageUrl = "assets/laptop.bmp";
        lbl_Name.Text = "Laptop";
        lbl_desc.Text = "This is a cheap laptop!";
        lbl_price.Text = "199.99";
        break;
}

Очевидно, что есть другие записи, которые я опускаю.Я хочу нажать следующую или предыдущую кнопку и использовать это событие для изменения данных Context.Items ["pageNum"], чтобы в событии Page_Load () использовались разные данные в операторе switch.Надеюсь, что это имеет смысл.Вот одно из событий нажатия кнопки:

protected void btn_Prev_Click(object sender, EventArgs e)
{
        if (pageNumber == 1 || pageNumber == 2)
        {
            Context.Items["pageNum"] = 1;
        }
        else if (pageNumber == 3)
        {
            Context.Items["pageNum"] = 2;
        }
        Context.Items["preferred"] = preferredCustomer;
        Server.Transfer("ProductsShelf.aspx");
}

Проблема состоит в том, что до того, как событие нажатия кнопки сработает, форма отправляет и очищает значения Context.Items и pageNumber.Это означает, что оператор кнопки if никогда не срабатывает, и это приводит к:

pageNumber = (int)Context.Items["pageNum"];

Нулевому значению, выбрасыванию исключения и очень огорчениюИтак, мой вопрос, как я могу сохранить ценности?Должен ли я переключиться на Response.Redirect и иметь что-то вроде? Page = 1 в URL?Или это будет ясно, когда форма сообщения?Надеюсь, я не делаю это полностью неправильно.

Если TL; DR, вот краткая сводка:

  1. Context.Items имеет 2 значения, переданные с Server.Transfer
  2. Эти значения определяют то, что будет показано на следующей странице
  3. Форма очищает Context.Items и переменные перед тем, как сработает событие нажатия кнопки
  4. Значения равны NULL, оператор if не выполняется,и приложение выдает исключение
  5. Вопрос: как мне сохранить эти значения?

Большое спасибо.:)

1 Ответ

3 голосов
/ 04 ноября 2010

Элементы HttpContext могут использоваться только в одном запросе - он будет воссоздан для следующего запроса, поэтому ваши значения неизбежно будут потеряны.Вы должны использовать view-state для сохранения данных между постбеками.При загрузке страницы вы должны проверить, существуют ли данные в контексте, а затем скопировать их в состояние просмотра.Затем в событиях нажатия кнопки вы можете прочитать данные из состояния просмотра, поместить в контекстные элементы и выполнить server.transfer.Вот простой пример кода:

private int PageNumber
{
   get 
   { 
    var value = ViewState["pageNum"]; 
    return null == value? 1: (int)value;
   }
   set
   {
     ViewState["pageNum"] = value;
   }
}

private bool IsPreferredCustomer
{
   get 
   { 
    var value = ViewState["preferred"]; 
    return null == value? false: (bool)value;
   }
   set
   {
     ViewState["preferred"] = value;
   }
}

protected void Page_Load(object sender, EventArgs e)
{
    var preferred = Context.Items["preferred"];
    if (null != preferred)
    {
      IsPreferredCustomer =  (bool)preferred;
    }
    var pageNum = Context.Items["pageNum"];
    if (null != pageNum )
    {
      PageNumber =  (int)Context.Items["pageNum "];
    }
}

Используйте то же свойство PageNumber в коде события.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...