页面上的asp.net免费会话变量发生变化

时间:2013-11-29 10:15:47

标签: c# asp.net session viewstate

我有一个Web应用程序,它使用Session变量来保存某些数据表的状态。我没有使用viewstate来增加页面的重量。

我不需要在页面更改时保持状态,所以我想在页面上释放这些会话变量。

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

5 个答案:

答案 0 :(得分:7)

会话数据对于在页面生命周期之外存储数据非常有用。如果您不想将其存储在页面的生命周期之外,那么会话数据不适合您。

答案 1 :(得分:3)

导航到页面后尝试此操作

Session.Remove("Name");

或完全删除会话

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

答案 2 :(得分:1)

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

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

另一个评论:建议你使用viewstate,因为pemit你持久化数据而不添加代码,重要的是<每页30K。就这个

答案 3 :(得分:1)

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

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

答案 4 :(得分:1)

一种方法是使用网络应用程序的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");
        }
    }
}

然而,当会话到期时,我会让它静静地死去。