Я нашел один способ сделать это, немного обманув с помощью упорядочивания, наследования и параметра AttributeUsage
Сначала определите свой ActionFilter для контроллера
[AttributeUsage(AttributeTargets.Class)]
public class FilterController : ActionFilterAttribute
{
public FilterController()
{
this.Order = 2;
}
public override void OnActionExecuted(ActionExecutedContext filterContext)
{
if (!filterContext.HttpContext.Items.Contains("WeAlreadyWentThroughThis"))
{
// do our thing
filterContext.HttpContext.Items.Add("WeAlreadyWentThroughThis", "yep");
base.OnActionExecuted(filterContext);
}
}
}
Затем наследуйте класс для вашего атрибута действия
[AttributeUsage(AttributeTargets.Method)]
public class FilterAction : FilterController
{
public FilterAction()
{
this.Order = 1;
}
}
Это далеко не идеально, так как вы должны полагаться на HttpContext и два класса (хотя вы могли бы использовать пространства имен для имен обоих классов одинаково). Но вы получаете принудительную проверку области действия атрибута для класса или действия, и вы не забудете параметр порядка при наборе кода.