正在执行会话数据
本文关键字:数据 会话 执行 | 更新日期: 2023-09-27 18:23:57
我有一个web表单,它从默认网页中实例化一个类。该类实现了会话数据,网页也是如此,但我很难使会话保持不变。
每次重新加载页面时,它都会重新实例化类,从而重新实例化会话,从而使会话的整个概念变得毫无意义。
如何在不在页面本身或从页面实例化的任何类中实例化会话的情况下实现会话?或者我有错误的想法?
供参考,这里是页面和子类。在你看到"…"的地方,一些不必要的代码被省略了:
子类:
public class invoiceHandler
{
public HttpContext sessionContext = HttpContext.Current;
...
}
页面:
public partial class _Default : Page
{
Program.invoiceHandler handler = new Program.invoiceHandler();
...
protected void updateactionsGridBind()
{
handler.sessionContext = HttpContext.Current;
try
{
invGrid.Columns[7].Visible = false;
invGrid = (GridView)handler.sessionContext.Session["editaction"];
...
}
...
}
...
protected void saveButton_Click(object sender, EventArgs e)
{
handler.sessionContext = HttpContext.Current;
invGrid.EditIndex = -1;
string kinvConv = invGrid.Rows[0].Cells[0].Text;
handler.sessionContext.Session["editaction"] = invGrid;
tools.i = kinvConv;
tools.ToInt();
handler.sessionContext.Session["kinv"] = tools.j;
handler.sessionContext.Session["<REDACTED>"] = invGrid.Rows[0].Cells[1].Text;
handler.sessionContext.Session["sup"] = invGrid.Rows[0].Cells[2].Text;
handler.sessionContext.Session["supn"] = invGrid.Rows[0].Cells[3].Text;
handler.sessionContext.Session["net"] = invGrid.Rows[0].Cells[4].Text;
handler.sessionContext.Session["vat"] = invGrid.Rows[0].Cells[5].Text;
handler.sessionContext.Session["date"] = invGrid.Rows[0].Cells[6].Text;
OnUpdate(sender, e);
}
...
}
在savebutton_click
的点上,会话似乎丢失了其数据。
在saveButton_Click
中,您使用的是变量invGrid
。您可能认为您已经在updateactionsGridBind
中为其分配了一个值,但我猜这是在您显示页面并单击saveButton之前发生的。
回发(或者更确切地说,任何请求)使用页面类的新实例,因此所有变量都已重置(在本例中为null)。您需要从会话中再次获得该值。
根据提供的代码示例,我不完全确定您是否理解HttpContext.Current
的工作原理。您似乎正在使用它来缓存上下文的当前状态。(我可能完全错了!)
HttpContext.Current
是一个静态值。创建一个表示它的属性,除了创建一个指向它的快捷方式外,收效甚微。它肯定不会导致您在页面回发之间丢失状态。
类似地,HttpContext.Current.Session
是一个静态值。因此,它不会在页面回发之间丢失值,除非:
- 某些情况导致会话状态被丢弃,例如IIS或正在重新启动的应用程序池
- 页面、请求或应用程序的会话状态已禁用
- 您不再处于同一会话中
检查以验证是否未禁用请求、页面或应用程序的会话状态。此外,请检查以验证您是否启用了Cookie。(会话状态通常通过使用cookie来启用。)