【问题标题】:asp.net free session variables on page change页面更改时的 asp.net 免费会话变量
【发布时间】:2013-11-29 10:15:46
【问题描述】:

我有一个 Web 应用程序,它使用会话变量来维护某些数据表的状态。我没有使用视图状态来增加页面的权重。

我不需要在页面更改时维护状态,所以我想在页面离开时释放这些会话变量。

当用户更改网站页面时如何拦截?有没有像“Page Leave”这样的方法?

【问题讨论】:

  • 您希望会话存储数据表您只能将数据保存在数据表中。你要加入会话吗?
  • 我需要同一页面上不同事件的数据表,例如,gridview order 或 paging...

标签: c# asp.net session viewstate


【解决方案1】:

会话数据对于存储超出页面生命周期的数据很有用。如果您不想在页面生命周期之后存储它,那么 Session 数据不适合您。

【讨论】:

  • 但是会话数据通常是特定于页面的。
  • 是的,但这并不能回答问题,请考虑以下情况:我们希望在回发中保留特定页面中的值,但我们希望在用户离开页面后释放会话变量。
【解决方案2】:

导航到页面后试试这个

Session.Remove("Name");

或完全删除会话

Session.Clear();
or 
Session.Abadon();

【讨论】:

    【解决方案3】:

    我建议你为你网站的所有页面使用类库,并使用PreviousPage 属性,它允许你定义你的链接(状态机图)

    您可以定义 Session.Remove 进行清理

    另一个备注:建议您使用 viewstate,因为允许您在不添加代码的情况下保留数据,重要的是每页

    【讨论】:

      【解决方案4】:

      在 Web 应用程序中,用户可以通过多种方式“离开”页面。 Web 应用程序的模型是基于请求的;客户端和服务器在请求之间不知道彼此。 cookie 或会话状态等一些技术试图弥合这一差距,但基本上没有任何联系。
      因此,如果用户离开页面,浏览器不会通知服务器,因此不存在 Page_Leave 这样的事件。但是,您可以在某些情况下解决此问题(例如,如果用户更改到应用程序的另一个页面),但不是全部。
      正如@Terror.Blade 指出的那样,会话数据用于需要在单个页面生命周期中持久化的数据。因此,我不建议将这些数据放入 Session 并在用户离开页面后找到一种(不是很稳定的)方法将其删除。
      似乎您不能为同一用户再次请求 DataTable (尽管这是一种常见方式)。我可以建议您以下替代方案:

      • 如果 DataTable 不太大,如您所知,ViewState 是一个断言数据不会在整个页面生命周期中持久保存的选项。
      • 您也可以使用Cache 来存储数据。与会话状态相比,缓存具有在一定时间后释放内存的能力,或者如果更重要的数据需要内存。但是,请做好准备,如果在请求之间将数据从缓存中删除,则可能需要再次获取数据。另请注意,缓存在所有用户之间共享,并且不限于会话,因此您需要确保用户不会看到不适合他们的信息。这也是一个优势,如果多个用户的 DataTable 相同,您可以将其存储在 Cache 中一次。

      【讨论】:

        【解决方案5】:

        一种方法是使用网络应用程序的global.asax 文件,它是Application_BeginRequest 事件:

        public class Global : System.Web.HttpApplication
        {
            protected void Application_BeginRequest(object sender, EventArgs e)
            {
                HttpContext context = base.Context;
                HttpRequest request = context.Request;
                string pageName = System.IO.Path.GetFileNameWithoutExtension(request.RawUrl);
                if (pageName != "YourPageName")
                {
                    if(context.Session["NameOfSessionVariable"] != null)
                        context.Session.Remove("NameOfSessionVariable");
                }
            }
        }
        

        但是,当会话过期时,我会让它默默地死去。

        【讨论】:

        • @tulkas85:这是什么意思?
        • 如果我想在页面更改时释放会话,也许我对你的代码做这样的事情:if (pageName != HttpContext.Current.Request.UrlReferrer.ToString())
        • @tulkas85:我认为您只需要在一个特定页面上使用DataTable。那么为什么不能用这个名字代替YourPageName呢?即使上一页没有使用 DataTable,您的方法也会在每次页面更改时删除此 Session 值。
        • 为什么需要会话中的表格?这将增加您的应用程序所需的不可预知的内存。如果数据发生变化,它也会引入同步问题。除此之外,如果您每页有一个表格,您可以为会话中的每个页面/表格应用上述逻辑。
        • @tulkas85:不,服务器上没有这样的方法或事件。您只能识别用户何时请求一个页面,而不是当他“离开”它时,因为他可以简单地关闭他的浏览器。
        猜你喜欢
        • 2011-04-14
        • 1970-01-01
        • 2013-01-14
        • 1970-01-01
        • 1970-01-01
        • 2013-05-14
        • 1970-01-01
        • 1970-01-01
        • 2013-03-05
        相关资源
        最近更新 更多