我正在研究一个班级项目,我遇到了一个我无法弄清楚的问题。我觉得它实际上非常简单,但我一直在研究这些东西,我不能再思考了。
我有一个登录页面,允许用户使用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,这里有一个快速摘要:
非常感谢。 :)
答案 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属性。