2015-05-14 36 views
1

我有两个操作筛选器,我需要一个在另一个之前显式执行的筛选器。我没有任何运气让他们合作并按预期的顺序执行。ActionFilters未按预期顺序执行,可能是autofac问题

public class RedirectSingleAttribute : ActionFilterAttrbute { 
    public UrlHelper Url { get; set; } // <= injected in OnActivating 
    public override void OnActionExecuted(ActionExectuedContext filterContext) { 
     /* ... magic ... */ 
    } 
} 

public class JsonRedirectAttribute : ActionFilterAttribute { 
    public override void OnActionExecuted(ActionExecutedContext filterContext) { 
     /* ... magic ... */ 
    } 
} 

public class SearchController : Controller { 
    [RedirectSingle(Order = 1)] 
    [JsonRedirect(Order = 2)] 
    public ActionResult Query(SearchCriteria criteria) { 
     /* some code */ 
    } 
} 

我的模块看起来像......

/* ... */ 
builder.RegisterControllers(typeof(MvcApplication).Assembly); 
/* ... */ 
builder.RegisterType<RedirectSingleAttribute>(); 
builder.RegisterType<JsonRedirectAttribute>() 
    .OnActivating(c => c.Instance.Url = c.Context.Resolve<UrlHelper>()); 
/* ... */ 
builder.RegisterFilterProvider(); 

我把两者的OnActionExecuted方法断点,并JsonRedirectAttribute始终保持第一执行。我尝试了颠倒顺序,并尝试使用AsActionFilterFor没有成功。

从操作方法中删除属性,并使用autofac注册样式,属性根本不会执行。

/* this ended up not working all, i.e. the action filters were never invoked */ 
builder.RegisterType<RedirectSingleAttribute>() 
    .AsActionFilterFor<SearchController>(c => c.Query(default(SearchCriteria)), 1); 
builder.RegisterType<JsonRedirectAttribute>() 
    .OnActivating(c => c.Instance.Url = c.Context.Resolve<UrlHelper>()) 
    .AsActionFilterFor<SearchController>(c => c.Query(default(SearchCriteria)), 2); 
+0

虽然我相信我尝试颠倒了顺序,但看起来并不是这样,因为我刚刚尝试颠倒顺序并正确执行。这篇文章帮助解释它:http://stackoverflow.com/questions/6152420/order-property-of-actionfilter-from-lowest-to-greatest-or-vice-versa – Dave

回答