我在任何地方都能看到设置context.Result为非null值将会阻止同一个类中的其他过滤器运行,但它不适用于我。在两个过滤器之间的重定向循环的结果如下:ASP.NET MVC ActionFilter并没有阻止其他过滤器运行
Global.asax中,在Application_Start()
:
GlobalFilters.Filters.Add(new FilterA(), 1);
GlobalFilters.Filters.Add(new FilterB(), 2);
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
FilterA:
public class FilterA : ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext context)
{
if (long thing that evaluates to true)
{
context.Result = new RedirectResult("~/Foo/Bar");
}
}
}
FilterB:
public class FilterB : ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext context)
{
if (...also true, but shouldn't run...)
{
context.Result = new RedirectResult("~/Foo/Baz");
}
}
}
我必须错过了一些东西......我试过在运行之前和之后尝试运行base.OnActionExecuting(context)
Resu但它似乎并不重要。
我会假设,这些过滤器将为Foo/Bar和Foo/Baz评估false ...否则您将处于重定向循环 –
我不确定你的意思。过滤器不计算任何东西。 if语句的结果均为true,并为两者设置context.Result。该逻辑是正确的,但是只有一个过滤器应该运行,而第二个过滤器不应该,这导致了重定向循环。从我读到的,FilterA设置结果应该阻止FilterB运行。 – Josh
我不确定运行的过滤器,但它会停止执行的动作。您是否曾尝试在每个过滤器上添加一个测试,以查看结果是否为空,然后从过滤器返回? – Slicksim