在ActionFilterAttribute中设置TempData

时间:2013-04-22 11:10:17

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

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

2 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:-1)

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