2010-10-29 138 views
3

我目前有2个过滤器,Auth和Redirect,它们执行以下操作:Filter Auth(实现IAuthorizationFilter和ActionFilter)检查用户登录和授权,如果失败,则将filterContext.Result设置为403(禁止)的HttpStatusCodeResult 。过滤器重定向(实现IActionFilter和ActionFilter)检查结果,如果它是403,则重定向到登录页面。ASP.NET MVC操作筛选器:在筛选器中设置filterContext.Result可防止执行其他筛选器?

我有他们施加到动作如下:

[Auth(Order=0)] 
[Redirect(Order=1)] 

然而,验证被执行但重定向从未被执行(未它提供的4种覆写投放方法之一)。如果我删除认证重定向获取执行,但如果我包含认证作为第一个过滤器,重定向不会执行。我想设置过滤器上下文的Result属性会阻止任何其他过滤器被执行,但我不能实现这种情况。仅供参考我正在使用ASP.NET MVC 3测试版,但这不应该改变任何东西。

更新:将Auth的过滤器类型更改为IActionFilter而不是IAuthorizationFilter会导致重定向中的OnResultExecuting和OnResultExecuted触发,但更改Response对浏览器的最终响应没有任何影响。

回答

2

我最终通过使重定向IResultFilter,写在OnResultExecuting以下固定它:

filterContext.HttpContext.Response.Redirect(url); 
0

当您设置HttpStatusCodeResult您正在设置重定向,所以第二个过滤器将不会执行(因为您已经重定向)。

+0

的HttpStatusCodeResult没有最终会被重定向,它只是告诉ASP.NET MVC服务了一个响应指定的状态码。 – Diego 2010-10-29 23:51:12