Когда срабатывает атрибут, могу ли я проверить, был ли он установлен на контроллере или действии?
Поведение, которое я хочу: используйте атрибут Action, если он существует, иначе используйте атрибут Controller. Что-то вроде этого:
public class TestAttribute : FilterAttribute, IAuthorizationFilter
{
public TestAttribute(string optionalParam = "") { /*...*/ }
public void OnAuthorization(AuthorizationContext filterContext)
{
bool isClassAttribute; // = ????
bool hasActionAttribute = filterContext.ActionDescriptor.GetCustomAttributes(typeof(TestAttribute ), false).Length > 0;
if (isClassAttribute && hasActionAttribute)
return; // handle in Action attribute
else
; // do stuff with optionalParam...
}
}
[TestAttribute]
public class TestClass
{
[TestAttribute(optionalParam:"foo"]
public ActionResult TestMethod() { return null; }
}
Я мог бы сделать это с помощью свойства Order, но не хочу устанавливать его каждый раз (или напугать).
Изменить/Решение
ОК, нашел решение моей проблемы (но не вопрос) - установка базового параметра атрибута AllowMultiple = false означает last instance of the same filter type is allowed, and all others are discarded
(и атрибуты контроллера запускаются первыми (?), так что все должно быть хорошо...).
[AttributeUsage(AttributeTargets.Method | AttributeTargets.Class, Inherited = true, AllowMultiple = false)]
public class TestAttribute : FilterAttribute, IAuthorizationFilter
{
public TestAttribute(string optionalParam = "") { /*...*/ }
public void OnAuthorization(AuthorizationContext filterContext)
{
// this should be the Action attribute (if exists), else the Controller attribute...
}
}
В любом случае, я задал немного другой вопрос, поэтому все равно буду давать баллы за ответ;)