我的项目中有很多页面。在我写的所有页面中:
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());
}
}
当用户登录网站时,当前用户角色将写入会话,当前用户登录将写入视图状态。当会话结束时,我认为我可以在viewstate中查看当前用户登录并在数据库中设置脱机状态。但是当session
为null时,viewstate也为null。我该怎么办?
答案 0 :(得分:2)
如果使用Response.redirect
,则无法跨页面访问ViewState。尝试使用Server.transfer
检查Access ViewState Across Pages以获取更多信息。
答案 1 :(得分:1)
不使用Forms Authentication是一种更好的方法而不是手动处理角色,视图状态和会话吗?
通过这种方式,您可以与当前Identity进行互动,以获取用户信息,而非自定义信息存储。
我认为您可能不应该依赖用户的回发来确定会话是否已过期。如果用户只是关闭浏览器怎么办?他/她将无限期地保持“在线”状态。
您应该为用户提供手动注销的机制。
现在,如果您使用InProc作为会话状态,则可以在global.asax中处理Session_End,以将该用户设置为数据库中的“Offline”。 如果您使用的是StateServer或SQLServer,则在超时时不会调用Session_End,您必须以自定义方式处理它,例如通过数据库服务器上的计划任务将用户标记为脱机。
现在,如果您真的需要非常精确地控制在线/离线状态,您可能需要采用更复杂的方法。一种选择是,每当用户执行任何操作时,在User表上的最后一个活动上存储日期时间。并考虑在特定时间内没有完成任何活动的任何用户离线。 另一种选择是用作保持活动调用的ajax调用来更新上面提到的日期时间。
答案 2 :(得分:0)
除了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)
{
}
}