Asp.net mvc 如何从Global.asax将数据获取到MVC视图

Asp.net mvc 如何从Global.asax将数据获取到MVC视图,asp.net-mvc,asp.net-mvc-2,global-asax,viewdata,Asp.net Mvc,Asp.net Mvc 2,Global Asax,Viewdata,我有一个MVC2 web应用程序,我刚刚在其中实现了一些会话超时代码。在Global.asax中,我添加了一个Session\u End处理程序,用于检查记录是否打开进行编辑,如果是,则向外部系统发出Web服务调用以回滚存储库中的记录,从而使其不会锁定在“打开进行编辑”状态。该记录仍显示在用户的浏览器中,因为我们无法将消息推送到浏览器以关闭该记录 当用户下一次与(现在已超时)页面交互时,例如刷新、取消、保存或提交页面,web应用程序会看到用户未登录(会话已过期,因此登录随之进行),并重定向到登录

我有一个MVC2 web应用程序,我刚刚在其中实现了一些会话超时代码。在
Global.asax
中,我添加了一个
Session\u End
处理程序,用于检查记录是否打开进行编辑,如果是,则向外部系统发出Web服务调用以回滚存储库中的记录,从而使其不会锁定在“打开进行编辑”状态。该记录仍显示在用户的浏览器中,因为我们无法将消息推送到浏览器以关闭该记录

当用户下一次与(现在已超时)页面交互时,例如刷新、取消、保存或提交页面,web应用程序会看到用户未登录(会话已过期,因此登录随之进行),并重定向到登录页面

在登录页面上,我想显示一条消息,解释用户被重定向的原因,例如:“您的会话超时;请重新登录。如果您打开了一条记录,它将回滚到以前的状态。”

问题:来自
Global.asax
,我可以将消息存储在哪里,以便登录控制器或视图在重定向时可以找到它?我似乎在
Global.asax
中找不到对
ViewData
的引用。当我引用它时,就像:

 System.Web.Mvc.ViewPage<My...LoginViewModel>.ViewData["ErrorMessage"] = "Your session timed out..."
System.Web.Mvc.ViewPage.ViewData[“ErrorMessage”]=“您的会话超时…”
我得到一个错误:

An object reference is required for the non-static field, method, or property 'System.Web.Mvc.ViewPage<My...LoginViewModel>.ViewData.get'
非静态字段、方法或属性“System.Web.Mvc.ViewPage.ViewData.get”需要对象引用

我正在尝试的是可能的,而我只是不知道引用
ViewData
的正确方法,或者
ViewData
无法访问
Global.asax
?在这种情况下,设置来自
Global.asax
的消息显示在视图中的最佳选项是什么?

@Val-首先,您不应该以这种方式进行身份验证。您应该使用管道和FormsAuthentication或类似工具。这会造成安全漏洞,攻击者或恶意软件机器人会利用这些漏洞进行攻击。第二,不能保证会话结束会触发,因此记录可以无限期锁定。例如,如果工作进程被回收,则不会调用任何会话结束,因此不能依赖此机制解锁资源


我建议您重新考虑您的设计,不要以这种方式锁定记录进行编辑,并且不要依赖会话结束来完成任何至关重要的事情。

@Val-首先,您不应该以这种方式进行身份验证。您应该使用管道和FormsAuthentication或类似工具。这会造成安全漏洞,攻击者或恶意软件机器人会利用这些漏洞进行攻击。第二,不能保证会话结束会触发,因此记录可以无限期锁定。例如,如果工作进程被回收,则不会调用任何会话结束,因此不能依赖此机制解锁资源


我建议您重新考虑您的设计,不要以这种方式锁定记录进行编辑,也不要依赖session_end来完成任何至关重要的事情。

为什么需要使用Global.asax?我认为您的解决方案是不可能的。您如何知道消息是针对特定用户的?由于他们没有有效的会话,他们不是被FormsAuthentication重定向到登录页面吗?@SLaks,恐怕会话结束处理程序需要在Global.asax中,因为它是由一个独立的工作进程而不是主应用程序的进程触发的,所以我无法在我的应用程序类中捕获它。我弄错了吗?
Session\u End
在任意时间触发,而不是在HTTP请求期间。没有要使用的视图或ViewData。@Dallas,它们不是通过Forms Auth重定向的;相反,我的控制器在会话中检查用户,如果找不到,则重定向到登录页面。当我的控制器打开记录进行编辑时,他们将记录ID放入会话中;当会话结束时,我们发出回滚消息并传递记录ID,以便知道要回滚哪个记录。但你是对的——很久以后,当我重定向到登录时,会话已经结束很久了,所以我怎么知道哪个用户需要发送消息呢。嗯,也许我需要放弃这个功能。为什么它需要在全球。尽快?我认为你的解决方案是不可能的。您如何知道消息是针对特定用户的?由于他们没有有效的会话,他们不是被FormsAuthentication重定向到登录页面吗?@SLaks,恐怕会话结束处理程序需要在Global.asax中,因为它是由一个独立的工作进程而不是主应用程序的进程触发的,所以我无法在我的应用程序类中捕获它。我弄错了吗?
Session\u End
在任意时间触发,而不是在HTTP请求期间。没有要使用的视图或ViewData。@Dallas,它们不是通过Forms Auth重定向的;相反,我的控制器在会话中检查用户,如果找不到,则重定向到登录页面。当我的控制器打开记录进行编辑时,他们将记录ID放入会话中;当会话结束时,我们发出回滚消息并传递记录ID,以便知道要回滚哪个记录。但你是对的——很久以后,当我重定向到登录时,会话已经结束很久了,所以我怎么知道哪个用户需要发送消息呢。嗯,也许我需要放弃这个功能。对不起,我的评论不清楚。我们确实有一个表单Auth loginUrl,但是我们也为用户检查控制器,所以总是优先;到目前为止,我还没有看到管道执行重定向。你关于会话结束不可靠的观点是正确的。这并不是一个防弹的功能,但可以减少用户在夜间打开记录进行编辑时记录锁定的问题。更改记录锁定语义可能是明年重新编写MVC3(4?)的一个选项,但现在不是。@Val-Forms Auth将优先于您在页面中所做的任何操作,因为如果FormsAuth cookie过期,页面中的代码将永远不会执行。如果您手动重定向用户,那么只需添加一个查询字符串,表明它来自