我有一个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
点,会话似乎丢失了数据。
答案 0 :(得分:1)
在saveButton_Click
中,您使用的是变量invGrid
。您可能认为已在updateactionsGridBind
中为此分配了一个值,但我的猜测是您在显示页面并单击saveButton之前发生的。
回发(或者更确切地说是任何请求)使用页面类的 new 实例,因此任何变量都已重置(在本例中为null)。您需要从会话中再次获得该值。
答案 1 :(得分:1)
根据提供的代码示例,我不完全确定您了解HttpContext.Current
的工作原理。您似乎正在使用它来缓存上下文的当前状态。 (我可能完全错了!)
HttpContext.Current
是一个静态值。创建表示它的属性除了创建它的快捷方式之外几乎没有什么用处。它肯定不会导致你在页面回发之间失去状态。
同样,HttpContext.Current.Session
是一个静态值。因此,它不会在页面回发之间丢失值,除非:
检查以确认您没有为请求,页面或应用程序禁用会话状态。另外,请检查以确认您已启用Cookie。 (会话状态通常通过使用cookie来启用。)