以下对我来说很好。由于您在 _loggedInTime 前加上下划线,因此我假设您将其声明为页面本身的实例变量。
private DateTime _loggedInTime;
protected void Page_Load(object sender, EventArgs e)
{
if (Session["LoggedInTime"] == null)
Session["LoggedInTime"] = DateTime.Now;
_loggedInTime = Convert.ToDateTime(Session["LoggedInTime"]);
TimeSpan elapsedtimespan = DateTime.Now.Subtract(_loggedInTime);
int elapsedtime = Convert.ToInt32(elapsedtimespan.TotalSeconds);
}
我猜你是在另一个时间计算经过的时间,而不是在上面的例子中的 Page_Load 中。
在计算经过时间之前,请确保在每次回发时正确加载会话的经过时间。在下一个回帖中,_loggedInTime 被重置为 DateTime 的默认值,即 {1/1/0001 12:00:00 AM}。
我认为您对以下设置有所了解。
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
if (Session["LoggedInTime"] == null)
Session["LoggedInTime"] = DateTime.Now;
_loggedInTime = Convert.ToDateTime(Session["LoggedInTime"]);
}
}
private void ButtonClick(object sender, ImageClickEventArgs e)
{
TimeSpan elapsedtimespan = DateTime.Now.Subtract(_loggedInTime);
int elapsedtime = Convert.ToInt32(elapsedtimespan.TotalSeconds);
}
在这里,我通过在单击按钮时处理回发来演示它。在这种情况下,Page_Load 不会加载 LoggedInTime,并且经过的时间计算不正确。要解决此问题,只需删除 Page_Load 中的 IsPostBack if 语句。确保每次加载页面时都设置实例变量 _loggedInTime,因此在回发时也是如此。
备注:还要检查您是否在服务器场上。如果您使用多个服务器来处理您的请求但配置了错误的会话模式(例如在进程中),那么服务器 A 会将会话变量存储在其内存中,但重定向可以由服务器 B 处理,它不知道服务器 A 的内存中会话存储。
更多信息可以在 MSDN 上找到:
会话状态模式
进程中的会话状态是默认设置,在服务器场方案中,您可以使用 StateServer 或 SqlServer 替代方案在服务器之间共享会话状态。或者您可以编写自己的自定义会话状态提供程序。