У меня есть 2 фильтра действий, где мне нужен тот, который явно должен выполняться перед другим. Мне не повезло с тем, чтобы заставить их сотрудничать и выполнять в ожидаемом порядке.ActionFilters не выполняются в ожидаемом порядке, возможно, проблема с автозагрузкой
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
без успеха.
Удаление атрибутов из метода действий и использование стиля автоматической регистрации атрибутов не выполняются вообще.
/* 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