C# 使用Ninject注入的自定义IAuthorizationFilter会停止执行其他ActionFilterAttribute
在我正在处理的一个项目中,有两个自定义ActionFilterAttribute类,它们是使用ninjects BindFilter注入的: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&
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 = ...