C# 使用Ninject注入的自定义IAuthorizationFilter会停止执行其他ActionFilterAttribute

C# 使用Ninject注入的自定义IAuthorizationFilter会停止执行其他ActionFilterAttribute,c#,asp.net-mvc-3,ninject,C#,Asp.net Mvc 3,Ninject,在我正在处理的一个项目中,有两个自定义ActionFilterAttribute类,它们是使用ninjects BindFilter注入的: kernel.BindFilter<LogErrorsAttribute>(FilterScope.Last, 0); kernel.BindFilter<CriticalErrorAttribute>(FilterScope.Last, 1); kernel.BindFilter&

在我正在处理的一个项目中,有两个自定义ActionFilterAttribute类,它们是使用ninjects BindFilter注入的:

        kernel.BindFilter<LogErrorsAttribute>(FilterScope.Last, 0);
        kernel.BindFilter<CriticalErrorAttribute>(FilterScope.Last, 1);
        kernel.BindFilter<AuthorizationFilter>(FilterScope.Action, null).WhenActionMethodHas<Authorise>().WithPropertyValueFromActionAttribute<Authorise>("Roles", n => n.Roles).WithPropertyValueFromActionAttribute<Authorise>("Years", n => n.Years);
如果您能帮助解决此问题,我们将不胜感激

编辑:

这是其他过滤器之一:

public class CriticalErrorAttribute : ActionFilterAttribute
{
    [Inject]
    public IErrorServices ErrorService { private get; set; }

    public override void OnActionExecuted(ActionExecutedContext filterContext)
    {            //if the request is an ajax request, we don't want a redirect to happen
        //the controller dealing with the ajax request can fetch the critical
        //errors and pass them back to the user for display
        if (!filterContext.HttpContext.Request.IsAjaxRequest())
        {
            var criticalErrors = ErrorService.FetchCriticalErrors();

            if (criticalErrors.HasContent())
            {
                var helper = new UrlHelper(filterContext.RequestContext);
                var url = helper.Action("Error", "Home", new { area = "" });

                filterContext.Controller.TempData["CriticalErrorList"] = criticalErrors;

                filterContext.Result = new RedirectResult(url);
            }
        }
        base.OnActionExecuted(filterContext);
    }
}
如果域对象无法水合,它将记录一个严重错误。此筛选器检查是否存在此类错误,如果出现此类错误,它会将用户指向错误页面

已解决:

原来达林是对的!但我的过滤器配置隐藏了这个问题。 首先,我拥有导航项目的[授权],其次,我将CriticalErrorAttribute绑定到每个操作。 因此,每次创建菜单时(欢迎、左侧、导航、sub),都会触发此过滤器。在这个过滤器调用链中的某个时刻,结果被应用到filterContext.Result-后面的结果隐藏了前面的(正确的)结果

为了克服这个问题,我将CriticalErrorAttribute的BindFilter配置行调整为:

kernel.BindFilter<CriticalErrorAttribute>(FilterScope.Last, 0).When( (context, ad) =>
context.RouteData.DataTokens["action"] != null && context.RouteData.DataTokens["action"] !=
"Error" && context.RouteData.DataTokens["controller"] != "Navigation");
kernel.BindFilter(FilterScope.Last,0).When((context,ad)=>
context.RouteData.DataTokens[“action”!=null&&context.RouteData.DataTokens[“action”]=
“错误”&&context.RouteData.DataTokens[“控制器”]!=“导航”);
现在一切都很好

这里:

filterContext.Result = ...
您正在分配一个结果。并根据:

您可以在OnActionExecuting和 OnResultExecuting方法,方法是将Result属性设置为非null 价值任何挂起的OnActionExecuted和OnActionExecuting筛选器都将 不会被调用,并且调用程序不会调用OnActionExecuted 方法用于取消的筛选器或挂起的筛选器。这个 以前运行的筛选器的OnActionExecuted筛选器将运行。全部 OnResultExecuting和OnResultExecuted筛选器将运行

在这里:

您正在分配一个结果。并根据:

您可以在OnActionExecuting和 OnResultExecuting方法,方法是将Result属性设置为非null 价值任何挂起的OnActionExecuted和OnActionExecuting筛选器都将 不会被调用,并且调用程序不会调用OnActionExecuted 方法用于取消的筛选器或挂起的筛选器。这个 以前运行的筛选器的OnActionExecuted筛选器将运行。全部 OnResultExecuting和OnResultExecuted筛选器将运行


当其他筛选器未执行时,您的筛选器将返回什么?我已使用其他筛选器之一更新了我的问题。您没有回答我的问题。域模型的返回视图为null,因此它将引发异常。在将自定义身份验证属性放置到操作上之前,筛选器在执行操作之前捕获了此类错误,并将其显示在错误页上。如果“if(!AuthorizeCore(filterContext.HttpContext))SetCachePolicy(filterContext);”这看起来是错误的。是的!正确吗?当其他筛选器未执行时,您的筛选器将返回什么?我已使用其他筛选器之一更新了我的问题。您没有回答我的问题。域模型的返回视图为null,因此它将引发异常。在将自定义身份验证属性放置到操作上之前,筛选器在执行操作之前捕获了此类错误,并将其显示在错误页上。如果“if(!AuthorizeCore(filterContext.HttpContext))SetCachePolicy(filterContext);”这看起来是错误的。是的!正确吗?嗨,达林,我只在验证失败的情况下分配一个结果。所以代码没有被执行。为了检查,我删除了这些代码行,问题仍然存在。我在问题的底部添加了一些文本,这可能会有所帮助。嗨,Darin,你在这个问题上是正确的。调试花了一段时间,但我已将我的解决方案附加到我的答案中。嗨,达林,我只在验证失败时分配一个结果。所以代码没有被执行。为了检查,我删除了这些代码行,问题仍然存在。我在问题的底部添加了一些文本,这可能会有所帮助。嗨,Darin,你在这个问题上是正确的。调试花了一段时间,但我已将解决方案附加到我的答案中。
filterContext.Result = ...