我有一个MVC2 web应用程序,其中我刚刚实现了一些会话超时代码。在Global.asax
中,我添加了一个Session_End
处理程序,该处理程序检查记录是否打开进行编辑,如果是,则向外部系统发出Web服务调用以回滚存储库中的记录,以便它不锁定在“用于编辑'状态。记录仍然显示在用户的浏览器中,因为我们无法将消息推送到浏览器来关闭记录。当用户接下来与(现在超时)页面交互时,例如,要刷新,取消,保存或提交,Web应用程序会看到用户未登录(会话已过期,因此登录名随之一起),然后重定向到登录页面。如何从Global.asax获取数据到MVC视图
在登录页面上,我想显示一条消息,解释用户重定向的原因,如下所示:“您的会话超时;请重新登录;如果您有记录打开,则会恢复到先前的状态状态。”
问题:从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中? – SLaks
我不认为你的解决方案是可能的。您如何知道某条消息是针对特定用户的?由于它们没有有效的会话,它们是不是被FormsAuthentication重定向到登录页面? – Dallas
@SLaks,AFAIK Session_End处理程序需要在Global.asax中,因为它是由单独的工作进程触发的,而不是我的主应用程序的进程,所以我无法在我的应用程序类中捕获它。我错了吗? – Val