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......
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;
}
}