【发布时间】:2011-11-18 19:10:16
【问题描述】:
我有一个 MVC2 Web 应用程序,我刚刚在其中实现了一些会话超时代码。在Global.asax 中,我添加了一个Session_End 处理程序,该处理程序检查记录是否打开以供编辑,如果是,则向外部系统发出Web 服务调用以回滚存储库中的记录,因此它不会锁定在“打开编辑”状态。记录仍然显示在用户的浏览器中,因为我们无法向浏览器推送消息以关闭记录。
当用户下次与(现在已超时)页面交互时,例如要刷新、取消、保存或提交它,Web 应用程序会看到用户未登录(会话已过期,因此登录随之而来),并重定向到登录页面。
在登录页面上,我想显示一条消息,解释用户被重定向的原因,例如:“您的会话超时;请重新登录。如果您打开了一条记录,则它已回滚到之前的状态。”
问题:来自Global.asax,我可以将消息存储在哪里,以便登录控制器或视图在我们重定向时可以找到它?我似乎无法在Global.asax 中获得对ViewData 的引用。当我像这样引用它时:
System.Web.Mvc.ViewPage<My...LoginViewModel>.ViewData["ErrorMessage"] = "Your session timed out..."
我收到一个错误:
An object reference is required for the non-static field, method, or property 'System.Web.Mvc.ViewPage<My...LoginViewModel>.ViewData.get'
我正在尝试的是否可行,我只是不知道引用ViewData 的正确方法,还是ViewData 无法访问Global.asax?在这种情况下,将来自Global.asax 的消息设置为在视图中显示的最佳选择是什么?
【问题讨论】:
-
为什么需要在 Global.asax 中?
-
我认为您的解决方案是不可能的。您如何知道消息是针对特定用户的?由于他们没有有效的会话,他们不会被 FormsAuthentication 重定向到登录页面吗?
-
@SLaks,AFAIK Session_End 处理程序需要在 Global.asax 中,因为它是由与我的主应用程序进程不同的工作进程触发的,因此我无法在我的应用程序中捕获它类。我弄错了吗?
-
Session_End在任意时间触发,而不是在 HTTP 请求期间触发。没有要使用的视图或 ViewData。 -
@Dallas,它们没有通过 Forms Auth 重定向;相反,我的控制器会检查会话中的用户,如果找不到,则重定向到登录页面。当我的控制器打开记录进行编辑时,他们将记录 ID 放入会话中;当会话结束时,我们发出回滚消息并传递记录 ID,因此我们知道要回滚哪条记录。但你是对的 - 很久以后,当我重定向到登录时,会话早已消失,所以我怎么知道哪个用户需要发送消息。嗯,也许我需要放弃这个功能。
标签: asp.net-mvc asp.net-mvc-2 global-asax viewdata