tag route page net data asp all c# .net asp.net-core asp.net-core-mvc

c# - route - ¿Cómo se leen los atributos del método de acción en ASP.NET Core MVC?



forms asp net core (3)

Creé un método de extensión que imita los GetCustomAttributes originales basados ​​en la solución de Henk Mollema.

public static IEnumerable<T> GetCustomAttributes<T>(this Microsoft.AspNet.Mvc.Abstractions.ActionDescriptor actionDescriptor) where T : Attribute { var controllerActionDescriptor = actionDescriptor as ControllerActionDescriptor; if (controllerActionDescriptor != null) { return controllerActionDescriptor.MethodInfo.GetCustomAttributes<T>(); } return Enumerable.Empty<T>(); }

Espero eso ayude.

Basado en este artículo , intento crear una implementación de IActionFilter para ASP.NET Core que pueda procesar los atributos que están marcados en el controlador y la acción del controlador. Aunque leer los atributos del controlador es fácil, no puedo encontrar una forma de leer los atributos definidos en el método de acción.

Aquí está el código que tengo ahora:

public sealed class ActionFilterDispatcher : IActionFilter { private readonly Func<Type, IEnumerable> container; public ActionFilterDispatcher(Func<Type, IEnumerable> container) { this.container = container; } public void OnActionExecuting(ActionExecutingContext context) { var attributes = context.Controller.GetType().GetCustomAttributes(true); attributes = attributes.Append(/* how to read attributes from action method? */); foreach (var attribute in attributes) { Type filterType = typeof(IActionFilter<>).MakeGenericType(attribute.GetType()); IEnumerable filters = this.container.Invoke(filterType); foreach (dynamic actionFilter in filters) { actionFilter.OnActionExecuting((dynamic)attribute, context); } } } public void OnActionExecuted(ActionExecutedContext context) { throw new NotImplementedException(); } }

Mi pregunta es: ¿cómo leo los atributos del método de acción en ASP.NET Core MVC?


Mi atributo personalizado hereda de ActionFilterAttribute. Lo puse en mi controlador pero hay una acción, no lo necesito. Quiero usar el atributo AllowAnonymous para ignorar eso pero no funciona. Así que AllowAnonymous este fragmento en mi atributo personalizado para encontrar AllowAnonymous y omitirlo. Puedes obtener otro en el ciclo for.

public class PermissionAttribute : ActionFilterAttribute { public override void OnActionExecuting(ActionExecutingContext context) { foreach (var filterDescriptors in context.ActionDescriptor.FilterDescriptors) { if (filterDescriptors.Filter.GetType() == typeof(AllowAnonymousFilter)) { return; } } } }


Puede acceder al MethodInfo de la acción a través de la clase ControllerActionDescriptor :

public void OnActionExecuting(ActionExecutingContext context) { var controllerActionDescriptor = context.ActionDescriptor as ControllerActionDescriptor; if (controllerActionDescriptor != null) { var actionAttributes = controllerActionDescriptor.MethodInfo.GetCustomAttributes(inherit: true); } }

La clase MVC 5 ActionDescriptor solía implementar la interfaz ICustomAttributeProvider que daba acceso a los atributos. Por algún motivo, esto se eliminó en la clase ASP.NET Core MVC ActionDescriptor .