【问题标题】:Setting TempData within a ActionFilterAttribute在 ActionFilterAttribute 中设置 TempData
【发布时间】:2013-04-22 11:10:16
【问题描述】:

我有一个自定义操作过滤器,在OnActionExecuting 内,根据特定条件,注销用户并将他们重定向到网站的主页。重定向部分的(剥离)代码如下

  filterContext.Controller.TempData.Add("key", "Message");

  filterContext.Result = new RedirectResult("/");

如上所述,我也在设置一个 tempData 消息。因为用户已经注销,所以当他们点击主页时,[Authorize] 属性会将他们重定向到登录 GET 页面。在登录视图中,我正在显示来自 tempData 的任何消息。但是在这种情况下 tempData 是空的。

这与我的登录 POST 的工作方式非常相似(如果无效,它会重定向到主页,然后重定向到登录并显示登录帖子中设置的 tempData 消息)。这段代码可以在下面看到

   TempData.Add("key", errorMessage);

   return Redirect("/"));

我之所以这样做,而不是专门重定向到登录页面,是因为这段代码分布在许多站点上,所以我们不知道登录 GET url 是什么。

有没有人知道为什么这对登录 POST 有效,但对 ActionFilter 重定向无效?

编辑:

如果我删除自定义操作过滤器中的注销调用,tempData 仍然设置在 Home 操作中 - 但这并不能解释为什么它适用于 Login POST 而不是操作过滤器?

【问题讨论】:

    标签: c# asp.net-mvc tempdata actionfilterattribute


    【解决方案1】:

    事实证明,当我从系统中注销用户时,我也放弃了会话(调用 HttpContextBase.Session.Abandon())并重置了 cookie 会话 ID。这些影响了 TempData 行为。通过删除这些调用,现在可以正确设置和显示 tempData。

    【讨论】:

      【解决方案2】:

      将结果设置为new RedirectResult("/") 将导致当前服务器处理停止,并向客户端发送一个响应,告诉客户端请求一个新的 URL - 您在 RedirectResult 中所说的那个。第二个请求则不同,并且不包含来自先前处理的值。 尝试使用Redirect("/");Server.Transfer("/"); 在同一个客户端请求中为新路由提供服务。

      【讨论】:

      • 这就是我所追求的行为——我希望客户端请求一个新的 URL。 TempData 为空的原因是会话的放弃。
      猜你喜欢
      • 1970-01-01
      • 2014-08-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多