Search code examples
c#.net-coreaction-filteractionfilterattribute

Add parameter to the action filter from service filter


I am using a service filter attribute in the controller. From the service filter, I called the Action filter and inside the action filter, I do the action methods like OnActionExecution.

My case is passing the parameter from the controller. Using that parameter, I need to do the necessary actions in the action filter class.

Controller

[HasPermission(1)]
public async Task<ActionResult> GetDetailsAsync()
{
  -----
}

Service Filter

 public class HasPermissionAttribute : ServiceFilterAttribute
    {
        public HasPermissionAttribute()
            : base(typeof(HasPermissionAsyncFilter))
        {
        }
    }

Action filter

 public class HasPermissionAsyncFilter : IAsyncActionFilter
 {
       public async Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next)
       {
           -------------Need to use the values passed from the attribute-------
       }
 }

Note:

Need to pass the values in the attribute

HasPermission(1)

HasPermission(2)

Like this......


Solution

  • There's TypeFilterAttribute that is alike [ServiceFilterAttribute] but allows you to pass arguments:

    public class HasPermissionAttribute : TypeFilterAttribute // Changed parent class
    {
        public HasPermissionAttribute(int value)
            : base(typeof(HasPermissionAsyncFilter))
        {
            Arguments = new object[] { value };
        }
    }
    
    public class HasPermissionAsyncFilter : IAsyncActionFilter
    {
        private readonly int _permissionValue;
    
        public HasPermissionAsyncFilter(int permissionValue)
        {
            _permissionValue = permissionValue;
        }
    
        public async Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next)
        {
            // -------------Need to use the values passed from the attribute-------
            var x = _permissionValue;
        }
    }