在ActionFilterAttribute中设置TempData
我有一个自定义的操作过滤器,在OnActionExecuting
内部,根据特定条件,将用户注销并将其重定向到网站的主页。 重定向部分的(剥离)代码如下
filterContext.Controller.TempData.Add("key", "Message");
filterContext.Result = new RedirectResult("/");
如上所述,我也设置了一个tempData消息。 因为用户已经注销,所以当他们到达主页时, [Authorize]
属性将把它们重定向到登录GET页面。 在登录视图中,我显示来自tempData内的任何消息。 但是在这种情况下tempData是空的。
这与我的登录POST的工作方式非常相似(如果无效,它会重定向到home,它将重定向到登录并显示在Login帖子中设置的tempData消息)。 这个代码可以在下面看到
TempData.Add("key", errorMessage);
return Redirect("/"));
我这样做的原因,而不是专门重定向到登录页面,因为这个代码分布在很多网站,所以我们不知道登录GET网址是什么。
有没有人有任何信息,为什么这是为登录POST,但不是为ActionFilter重定向?
编辑:
如果我在自定义操作过滤器中删除了注销调用,那么tempData仍然设置在Home操作中 - 但是这不能解释为什么它对于登录POST而不是操作过滤器起作用?
所以事实证明,当我从系统注销用户时,我也放弃了会话(调用HttpContextBase.Session.Abandon()
),并重置了Cookie会话ID。 这些影响了TempData行为。 通过删除这些调用,现在可以正确设置和显示tempData。
将结果设置为new RedirectResult("/")
将导致当前的服务器处理停止,并向客户端发送一个响应,通知客户端请求一个新的URL - 您在RedirectResult中说过的一个新URL。 第二个请求然后是不同的,并且不包含先前处理的值。 尝试使用Redirect("/");
或Server.Transfer("/");
在相同的客户端请求中服务新的路由。