【问题标题】:How to get data to an MVC view from Global.asax如何从 Global.asax 获取数据到 MVC 视图
【发布时间】: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


【解决方案1】:

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

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

【讨论】:

  • 抱歉,我的评论不清楚。我们确实有一个 Forms Auth loginUrl,但我们还为用户签入了控制器,因此始终优先;到目前为止,我还没有看到管道进行重定向。您关于 Session_End 不可靠的观点是正确的。这并不是一个防弹功能,但是当用户让记录保持打开状态以供编辑时,可以减少记录锁定问题。更改我们的记录锁定语义可能是我们明年的 MVC3(4?) 重写的一个选项,但目前还不行。
  • @Val - Forms Auth 将优先于您在页面中执行的任何操作,因为如果 FormsAuth cookie 过期,页面中的代码将永远不会执行。如果您手动重定向用户,则只需添加一个查询字符串,表明它来自会话超时。也就是说,在您进行重定向的页面中(我假设您正在检查有效会话,如果没有重定向)将参数发送到您的登录页面并发送消息。
  • @MM,不确定这是否可行。我的页面已打开,但会话超时。我单击获取或发布到控制器的链接。控制器检查会话,发现它无效,然后重定向到登录。我看不到我的控制器如何知道记录处于什么状态——它需要提前知道用户打开进行编辑,以便传递正确的错误消息。
  • @val - 你误会了。您仍然使用 end_session 来关闭记录,但是当用户在超时后返回时,无论您使用什么机制来重定向用户都应该添加消息。我的意思是,您知道重定向用户,因此您知道会话不再有效。
猜你喜欢
  • 1970-01-01
  • 2016-03-11
  • 1970-01-01
  • 1970-01-01
  • 2016-10-16
  • 2013-01-05
  • 2014-08-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多