Context.Items在页面刷新/传输期间清除

时间:2010-11-04 02:33:03

标签: c# asp.net exception

我正在研究一个班级项目,我遇到了一个我无法弄清楚的问题。我觉得它实际上非常简单,但我一直在研究这些东西,我不能再思考了。

我有一个登录页面,允许用户使用Context.Items和Server.Transfer登录并将2个数据项传递到下一页。以下是代码段:

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

在“ProductsShelf”页面上,我可以访问这两个项目并使用如下数据:

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

然后我使用带有pageNumber的switch语句来显示某些信息:

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-statements永远不会触发并导致:

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

为空,抛出异常并让我非常难过。所以我的问题是,我该如何保留价值观?我应该切换到Response.Redirect并在URL中有类似?page = 1的内容吗?或者表格发布时是否也会清楚?希望我不是完全错了。

如果是TL; DR,这里有一个快速摘要:

  1. Context.Items有2个值与Server.Transfer
  2. 一起传递
  3. 这些值决定了下一页显示的内容
  4. 表单会在按钮点击事件触发前清除Context.Items和变量
  5. 值为null,if语句未运行,应用程序抛出异常
  6. 问题:我应该如何保留这些价值观?
  7. 非常感谢。 :)

1 个答案:

答案 0 :(得分:3)

HttpContext项目只能在一个请求中使用 - 它将为下一个请求重新创建,因此您的值必然会丢失。您应该使用视图状态来保留回发后的数据。在页面加载中,您应检查上下文中是否存在数据,然后将其复制到视图状态。然后在按钮单击事件中,您可以从视图状态读取数据,放入上下文项目并执行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属性。