我有一个自定义操作过滤器,在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 Redirect?
编辑:
如果我在自定义操作过滤器中删除了注销调用,则tempData仍然在Home操作中设置 - 但是这并不能解释为什么它适用于登录POST但不适用于操作过滤器?
答案 0 :(得分:4)
事实证明,当我从系统中注销用户时,我也放弃了会话(调用HttpContextBase.Session.Abandon()
)并重置了cookie会话ID。这些都影响了TempData行为。通过删除这些调用,现在可以正确设置和显示tempData。
答案 1 :(得分:-1)
将结果设置为new RedirectResult("/")
将导致当前服务器处理停止,并向客户端发送响应,告知客户端请求新URL - 您在RedirectResult中说过的URL。然后第二个请求是不同的,并且不包含先前处理的值。
尝试使用Redirect("/");
或Server.Transfer("/");
在同一客户端请求中为新路由提供服务。