Compiler ошибка довольно ясно, вы не можете вызвать любой метод при объявлении атрибута (потому что его значение должно быть известно во время компиляции), но вы можете получить свой собственный пользовательский атрибут, полученный из AuthorizeAttribute
выполнять все логики вам нужно. Разве это не то, что мы все сделали, чтобы локализовать друзей до фантастических долгожданных локализованных данных аннотаций?
Доказательство концепции:
class DynamicAuthorizeAttribute : AuthorizeAttribute {
protected bool AuthorizeCore(HttpContextBase context) {
// Perform your logic here, eventually update Roles property
}
}
И потом:
[DynamicAuthorize]
public ActionResult Get() {
// ...
}
Это просто один возможный путь, там вы можете поместить свою собственную логику или просто обновить Roles
свойство и делегировать обычным логика просто вызывает base.AuthorizeCore(context)
. Имейте в виду, что весь ваш код здесь должен быть потокобезопасным.
Если вы работаете со статическими методами, и вы хотите сохранить эту логику внутри контроллера, то вы можете играть вокруг, чтобы принять (например) что-то вроде этого:
[DynamicAuthorize(typeof(MyView), nameof(GetRole))]
Заметьте, что вы можете получить доступ к контроллеру и просмотреть имена от context.HttpContext.Request.RequestContext.RouteData
.
Затем вызовите такой статический метод. Обратите внимание: если логика действительно сложна и сильно меняется, вы можете захотеть централизовать эту логику и использовать другие инструменты MVC .
Вы не можете. Принимаются только значения параметров, которые могут быть разрешены во время компиляции. –
Атрибуты не хранятся как код, они хранятся как метаданные - поэтому вы можете использовать только ограниченный набор конструктов внутри них. –