7

我有一个自定义操作过滤器,它在 内部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 但不适用于操作过滤器?

4

2 回答 2

4

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

于 2013-04-22T13:37:39.573 回答
-1

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

于 2013-04-22T13:41:06.073 回答