实现会话数据

时间:2014-09-22 11:12:31

标签: c# session webforms

我有一个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点,会话似乎丢失了数据。

2 个答案:

答案 0 :(得分:1)

saveButton_Click中,您使用的是变量invGrid。您可能认为已在updateactionsGridBind中为此分配了一个值,但我的猜测是您在显示页面并单击saveButton之前发生的。

回发(或者更确切地说是任何请求)使用页面类的 new 实例,因此任何变量都已重置(在本例中为null)。您需要从会话中再次获得该值。

答案 1 :(得分:1)

根据提供的代码示例,我不完全确定您了解HttpContext.Current的工作原理。您似乎正在使用它来缓存上下文的当前状态。 (我可能完全错了!)

HttpContext.Current是一个静态值。创建表示它的属性除了创建它的快捷方式之外几乎没有什么用处。它肯定不会导致你在页面回发之间失去状态。

同样,HttpContext.Current.Session是一个静态值。因此,它不会在页面回发之间丢失值,除非:

  1. 某些内容导致会话状态被丢弃,例如IIS或正在重新启动的应用程序池
  2. 对页面,请求或应用程序禁用会话状态
  3. 您不再参加同一会议。
  4. 检查以确认您没有为请求,页面或应用程序禁用会话状态。另外,请检查以确认您已启用Cookie。 (会话状态通常通过使用cookie来启用。)