【问题标题】:asp.net set sessions before postbackasp.net 在回发之前设置会话
【发布时间】: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.
    }
}

我有点困惑,我以为PreRenderPageLoad 之后,为什么突然test var 为真,如果我删除PreRender 它不是?

问候

【问题讨论】:

  • 不清楚你想做什么,你想在新会话开始时只存储一次会话变量吗?
  • 您可以查看此链接dotnetcurry.com/ShowArticle.aspx?ID=126 - 尝试其中一项活动
  • Yes 只会在回发完成之前存储它们。之后,我将使用会话中的该值定义全局变量。所以会话只存在很短的时间,我对过期的会话没有任何问题。请参阅我的问题中的其他信息。我希望它会更清楚。 @yytg 我会看看。谢谢。
  • @Taz:关于您的第二次编辑:第一次运行在 Load 中将“test”设置为 true,然后将其存储在 PreRender 中的 Session 中。回发然后读取会话(在加载中)并获取上一个请求的“真”值。
  • @HansKesting 哦,我在第一次运行时错过了 PreRender 也在 PageLoad 之后运行。因此,会话为真是有道理的。超时后会再次为false,否则会话过期删除。所以我可以将超时设置得更高,或者使用带有 db 或 cookie 的解决方案,就像@richaux 说的那样。

标签: asp.net session postback


【解决方案1】:

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

【讨论】:

  • 嗯我不喜欢 cookie,它们是不安全的,如果我使用 db 解决方案,我应该如何使用会话 ID 识别用户?如果这里的会话 id 过期我该怎么办?谢谢。
  • 我假设您已经有一种识别用户的方法(例如用户 ID 或电子邮件地址?),所以您会使用它,并消除对 Session 的依赖。
  • 哦,是的,你是对的!那个评论是轻率的……对不起。嗯,这个解决方案需要更多的努力,但这是一个好主意。你认为这是我能做到的唯一方法,以防止会话超时吗?目前我重新加载页面,如果会话过期。它有效,但我认为这不是一个好的解决方案...... Greetz。
  • 没问题。 :) 你可以只增加会话超时!否则(取决于网站的用途)我会说用户可能希望在一段时间不活动后重新加载或重新验证他们的详细信息。或者,如果您担心 cookie 的安全性,可以选择使用 HTTPS?
  • 很遗憾我不能使用 HTTPS。但是请参阅我的第二次编辑,如果我使用 Page_PreRender 进行编辑,则信息在 PostBack 之后返回,或者错过了什么?
【解决方案2】:

如果值只需要在那个请求期间存在,您可以使用代码隐藏类的类级字段。在 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优点:没有超时,因为它存储在 html 中并与其他数据一起从浏览器回传。 缺点:它只适用于 postback-scanario,而不是当您链接到不同的页面时。

【讨论】:

  • 你能再解释一下吗?您是指 Web 部件中的自定义属性之类的东西吗?谢谢。
  • 好的,请看我的第二次编辑。你能告诉我它适用于Page_PreRender吗?我不知道为什么,或者错过了什么?谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多