gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 22:43:09 26 4
gpt4 key购买 nike

我正在做一个类(class)项目,但遇到了一个我无法解决的问题。我感觉这实际上很容易,但我一直在研究东西太久了,我再也无法理智了。

我有一个登录页面,允许用户登录并使用 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 语句永远不会触发,它会导致:

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

为空,抛出异常,让我很伤心。所以我的问题是,我怎样才能保留这些值(value)观?我应该切换到 Response.Redirect 并在 URL 中包含类似 ?page=1 的内容吗?或者当表单发布时也会清除吗?希望我这样做没有完全错误。

如果 TL;DR,这里有一个快速总结:

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

非常感谢。 :)

最佳答案

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

关于c# - Context.Items 在页面刷新/传输期间清除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4093431/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com