【发布时间】:2011-11-23 08:28:39
【问题描述】:
有没有一种简单的方法,可以在 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,我无法检查该变量,因为我丢失了信息。我知道我需要将信息存储在Session 中。如果我在将全局 var 设置为 true 时设置了 Session,我会遇到会话超时问题(如果用户在站点上,但有一段时间没有做某事)。所以我认为这会很好,如果我在丢失全局变量的信息之前设置会话并在重新初始化后删除会话。
这是我的想法,但我不知道这样的事情是否可行。
编辑2: 如果我遵循它的工作原理:
//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.
}
}
我有点困惑,我以为PreRender 在PageLoad 之后,为什么突然test var 为真,如果我删除PreRender 它不是?
问候
【问题讨论】:
-
不清楚你想做什么,你想在新会话开始时只存储一次会话变量吗?
-
您可以查看此链接dotnetcurry.com/ShowArticle.aspx?ID=126 - 尝试其中一项活动
-
Yes 只会在回发完成之前存储它们。之后,我将使用会话中的该值定义全局变量。所以会话只存在很短的时间,我对过期的会话没有任何问题。请参阅我的问题中的其他信息。我希望它会更清楚。 @yytg 我会看看。谢谢。
-
@Taz:关于您的第二次编辑:第一次运行在 Load 中将“test”设置为 true,然后将其存储在 PreRender 中的 Session 中。回发然后读取会话(在加载中)并获取上一个请求的“真”值。
-
@HansKesting 哦,我在第一次运行时错过了
PreRender也在PageLoad之后运行。因此,会话为真是有道理的。超时后会再次为false,否则会话过期删除。所以我可以将超时设置得更高,或者使用带有 db 或 cookie 的解决方案,就像@richaux 说的那样。