【问题标题】:how to keep data after session expires会话过期后如何保留数据
【发布时间】:2012-09-03 20:49:50
【问题描述】:

如果用户的会话已过期,我想将用户重定向到自定义页面。

On PageLoad
If Session("OrgID") = Nothing Then
    Response.Redirect("SchoolLogin.aspx?schoolID="+[schoolid])
End If

我可以将 schoolID 存储在每个页面的隐藏字段中,但这似乎不太优雅。我想尝试在每个页面上都有的用户控件中使用隐藏字段,但是用户控件 PageLoad 在主 PageLoad 之后触发,所以在检查会话到期之前我会收到一个错误。有一个通用的解决方案吗?

【问题讨论】:

  • SchoolID 是我要保留的数据。很容易重定向到用户登录页面,但他们还需要知道他们的 schoolID。
  • 可以通过查询字符串传递
  • Cookie 不起作用,因为该应用程序可能在多学校环境中使用。将 ID 添加到查询字符串似乎是一个很好的解决方案。

标签: asp.net vb.net session


【解决方案1】:

您可以使用 QueryString、ViewState(ASP.NET 的内置隐藏字段)或将其设置为 cookie 值。

我对你的场景了解不够。我能提供的最好的例子是我如何处理(我猜的)与你的情况相似。

为您的所有页面类创建一个基类以继承(更多这里是旧但很好http://www.4guysfromrolla.com/articles/041305-1.aspx),将您的 SchoolId 属性添加到它。这是在 c# 中,我很抱歉,不幸的是,VB.NET 语法确实让我牙疼。翻译起来应该不会太难,因为这是非常基本的东西。

使用 QuertString,您需要测试 -1 并在这种情况下重定向。

public class BasePage : System.Web.UI.Page
{
    public int SchoolId
    {
        get
        {
            if (Request.QueryString["schoolId"] != null)
            {
                return Convert.ToInt32(Request.QueryString["schoolId"]);
            }
            else
            {
                return -1;
            }
        }
    }
}

使用视图状态

public class BasePage : System.Web.UI.Page
{
    public int SchoolId
    {
        get
        {
            if (ViewState["schoolId"] != null)
            {
                return (int)ViewState["schoolId"];
            }
            else
            {
                int schoolId = someDataLayer.SelectUsersSchoolId(User.Identity.Name);
                ViewState["schoolId"] = schoolId;
                return schoolId;
            }
        }
    }
}

使用 cookie(更多信息)http://msdn.microsoft.com/en-us/library/aa289495(v=vs.71).aspx

public class BasePage : System.Web.UI.Page
{
    public int SchoolId
    {
        get
        {
            if (Request.Cookies["schoolId"] != null)
            {
                return (int)Request.Cookies["schoolId"].Value;
            }
            else
            {
                int schoolId = someDataLayer.SelectUsersSchoolId(User.Identity.Name);
                Request.Cookies["schoolId"].Value = schoolId;
                Request.Cookies["schoolId"].Expires = DateTime.Now.AddDays(1);
                return schoolId;
            }
        }
    }
}

【讨论】:

  • 如果我将隐藏字段添加到用户控件(在每个页面上),这将起作用。但是由于用户控件 PageLoad 在主页之后触发,我需要能够从继承的类中引用隐藏字段。像 me.findcontrol("hdnSchoolID").value 这样的东西。如果可能的话,对语法有一点帮助吗?
  • 嗯......看起来你让它变得比需要的更难。好的,我已经编辑了我的答案,希望能提供更多信息。希望我不会离开:)
  • 太棒了!非常感谢。使用 WiewState 选项。 QueryString 很简单,但使用菜单导航会遇到麻烦。 ViewState 非常简单。
猜你喜欢
  • 1970-01-01
  • 2016-03-30
  • 1970-01-01
  • 2017-12-12
  • 2020-12-11
  • 2019-11-10
  • 1970-01-01
  • 2017-07-23
  • 2015-09-22
相关资源
最近更新 更多