【问题标题】:Getting the value from viewstate, in case the session expires从视图状态获取值,以防会话过期
【发布时间】:2012-05-24 01:36:53
【问题描述】:

我的项目中有很多页面。在我写的所有页面中:

if (!IsPostBack)
{     
   if (HttpContext.Current.Session["curUserRole"] == null)
   {
      DBUsers.SetUserStatusOnline("0", ViewState["curUserLogin"].ToString());
      ViewState["curUserLogin"] = "";
      Response.Redirect("~/Login.aspx");
   }
   else
   {       
      ViewState["curUserLogin"] = HttpContext.Current.Session["curUserLogin"].ToString();
      DBUsers.SetUserStatusOnline("1", ViewState["curUserLogin"].ToString());
   }
}

当用户登录站点时,当前用户角色被写入会话,当前用户登录被写入视图状态。会话结束后,我以为可以在视图状态中查看当前用户登录,并在数据库中设置离线状态。但是当session 为空时,视图状态也为空。我能做什么?

【问题讨论】:

    标签: c# asp.net .net


    【解决方案1】:

    如果使用Response.redirect,则无法跨页面访问 ViewState。尝试使用Server.transfer

    查看Access ViewState Across Pages 了解更多信息。

    【讨论】:

      【解决方案2】:

      使用Forms Authentication 不是比手动处理角色、视图状态和会话更好的方法吗?

      这样您就可以与当前的Identity 交互以获取用户信息,而不是自定义信息存储。

      而且我认为您可能不应该依赖用户的回发来确定会话是否已过期。如果用户只是关闭浏览器怎么办?他/她将无限期地保持“在线”。

      您应该为用户提供手动注销的机制。

      现在,如果您使用InProc 作为会话状态,您可以在 global.asax 中处理 Session_End 以在数据库中将该用户设置为“离线”。 如果您使用 StateServer 或 SQLServer,则 Session_End 不会在超时时调用,您必须以自定义方式处理它,例如通过 DB 服务器上的计划任务将用户标记为离线。

      现在,如果您确实需要非常精确地控制在线/离线状态,您可能需要采用更复杂的方法。一种选择是,每当用户执行任何操作时,将日期时间存储在 User 表上的最后一个活动上。并考虑任何在特定时间内未进行任何活动的用户处于离线状态。 另一种选择是将 ajax 调用用作更新上述日期时间的保持活动调用。

      【讨论】:

        【解决方案3】:

        除了UnhandledException 的回答之外,我还要补充一点,最好将您的逻辑集中在一个类中,然后从该新类派生您的页面,而不是将其剪切并粘贴到每个页面:

        public class MyPageClass : System.Web.UI.Page
        {
            protected override void OnLoad(EventArgs e)
            {
                // Add your logic here.
        
                base.OnLoad(e);
            }
        }
        
        public class WebPage1 : MyPageClass
        {  
            private void Page_Load(object sender, System.EventArgs e)
            {
            }
        }
        

        【讨论】:

        • 好的。当任何页面重新加载且会话为空时,如何保存用户登录并调用此方法?
        • 我的回答是关于如何集中逻辑而不是将其剪切并粘贴到每一页的建议。您需要查看UnhandledException 的答案,以解决从另一个页面重定向时出现空ViewState 的问题。
        • @DarienFawkes - 虽然我很感谢这位代表,但我认为我的回答并不能解决您的问题。 UnhandledException的回答没有解决你的问题吗?如果是这样,你真的应该接受他的回答。
        猜你喜欢
        • 1970-01-01
        • 2023-03-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-02-02
        • 1970-01-01
        相关资源
        最近更新 更多