我有兩個操作篩選器,我需要一個在另一個之前顯式執行的篩選器。我沒有任何運氣讓他們合作並按預期的順序執行。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);
雖然我相信我嘗試顛倒了順序,但看起來並不是這樣,因爲我剛剛嘗試顛倒順序並正確執行。這篇文章幫助解釋它:http://stackoverflow.com/questions/6152420/order-property-of-actionfilter-from-lowest-to-greatest-or-vice-versa – Dave