Когда срабатывает атрибут, могу ли я проверить, был ли установлен контроллер или действие?
Поведение, которое я хочу: использовать атрибут 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, но не хочу каждый раз устанавливать его (или funky ).
Редактировать / Решение
ОК, нашел решение моей проблемы (но не вопрос) - установка базового параметра Attribute AllowMultiple = false означает last instance of the same filter type is allowed, and all others are discarded
(и атрибуты Controller запускаются первыми (?), Так что хорошо бы пойти ...).
[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...
}
}
Во всяком случае, я задал немного другой вопрос, так что все равно даст очки за ответ;)