【发布时间】:2014-03-31 22:18:29
【问题描述】:
我到处读到将 context.Result 设置为非空值会阻止同一类中的其他过滤器运行,但它对我来说不起作用。以下导致两个过滤器之间的重定向循环:
Global.asax,在Application_Start():
GlobalFilters.Filters.Add(new FilterA(), 1);
GlobalFilters.Filters.Add(new FilterB(), 2);
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
过滤器A:
public class FilterA : ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext context)
{
if (long thing that evaluates to true)
{
context.Result = new RedirectResult("~/Foo/Bar");
}
}
}
过滤器B:
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),但这似乎并不重要。
【问题讨论】:
-
我认为,这些过滤器将评估 Foo/Bar 和 Foo/Baz 的 false ...否则您将处于重定向循环中
-
我不确定你的意思。过滤器不评估任何东西。两个 if 语句都评估为 true,并且为两者设置了 context.Result。该逻辑是正确的,但是只有一个过滤器应该运行,而第二个不应该运行,这会导致重定向循环。根据我的阅读,FilterA 设置 Result 应该会阻止 FilterB 运行。
-
我不确定过滤器是否正在运行,但它会停止执行操作。您是否尝试过在每个过滤器上添加测试以查看结果是否不为空,然后从过滤器返回?
标签: c# asp.net-mvc asp.net-mvc-5 action-filter