asp.net在回发前设置会话

时间:2011-11-23 08:28:40

标签: asp.net session postback

有一种简单的方法,可以在PostBack启动之前立即在会话中存储所有需要的全局变量吗?或者我是否要将它们存储在我更改它们的每个步骤中? 我会做类似的事情:

// Global variable.
bool test = true;

// Store all needed information in a session.
protected void Before_globalvariable_is_set_to_default_value(...)
{
    Session["Test"] = test;
    ...
}

protected void Page_Load(object sender, EventArgs e)
{
    if(IsPostBack)
    {
        //if(Session["Test"] != null)
        //{
            test = (bool)Session["Test"];
            Session.Contents.Remove("Test");
        //}
    }
}

这样的事情可能吗?

其他信息

Page_Load (!IsPostBack)我检查用户是否获得更多视力,如果他获得了,我将全局变量设置为true。稍后在我的代码中,我检查var是否为真,并向GridView添加其他列。 现在,如果发生PostBack,我无法检查该var,因为我丢失了信息。我知道我需要将信息存储在Session中。如果我在将global var设置为true时设置Session,则会出现会话超时问题(如果用户在站点上,但暂时没有执行某些操作)。所以我认为这将是好的,如果我在丢失全局变量的信息之前不久设置会话并在重新初始化后删除会话。

这是我的想法,但我不知道这样的事情是否可行。

EDIT2: 如果我做了以下工作:

//Global variable
bool test = false;

protected void Page_PreRender(object sender, EventArgs e)
{
    Session["Test"] = test;
}

protected void Page_Load(object sender, EventArgs e)
{
    if (IsPostBack)
    {
        test = (bool)Session["Test"]; // Session is true!!!
        Session.Contents.Remove("Test");
    }
    else
    {
        test = true; // Set at the PageLoad the var to true.
    }
}

我有点困惑,我认为PreRenderPageLoad之后,为什么突然测试变量为真,如果我删除PreRender则不是?< / p>

格尔茨

2 个答案:

答案 0 :(得分:1)

如果值只需要在一个请求期间生效,则可以使用代码隐藏类的类级别字段。将它们设置为Init或Load阶段,然后您可以在所有其他阶段使用这些值。

只需一个请求的生命周期:

public partial class MyPage: Page
{
   private bool test = true;

   public void Page_Load(...)
   {
      // maybe set 'test' to another value
   }

   public void Button_Click(...)
   {
      // you can still access 'test'
   }

   public void Page_PreRender(...)
   {
      // you can still access 'test'
   }
}

但是,如果您需要将该值从请求转到下一步回发,则可以使用ViewState代替Session Advantage :没有超时,因为它存储在html中并从浏览器返回以及其他数据。 缺点:它仅适用于postback-scanario,而不是在链接到其他页面时。

答案 1 :(得分:1)

如果您担心在请求之间丢失特定值,因为您已在Session对象中维护该变量的状态,并且可能已被超时清除,您可以考虑使用另一个,更持久,保存状态的机制:例如,cookie或数据库。