Use ActionFilterAttribute com C#
Use ActionFilterAttribute com C#

Salve Dev, me chamo Jorel Magatti e sou Desenvolvedor c# .Net, aqui trago um artigo sobre a utilização de ActionFilterAttribute.
ActionFilterAttribute é uma classe base para atributos de filtro em C#. Ela é usada para modificar a maneira como uma ação é executada em um controlador. A estrutura ASP.NET MVC inclui vários filtros de ação, como OutputCache
, HandleError
e Authorize
. Você também pode criar seus próprios filtros de ação personalizados. Para criar um filtro de ação, você pode criar uma classe que herda da classe ActionFilterAttribute e implementar os métodos OnActionExecuting
, OnActionExecuted
, OnResultExecuting
e OnResultExecuted
. Neste artigo vou trazer uma exemplo filtros de ação personalizados aplicando um filtro basico de parametros de entrada de um end point dando um override no método OnActionExecuting
, segue abaixo o código:
public class AllRequiredInputValuesValidation : ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext context)
{
var parametros = context.ActionArguments;
if (parametros == null)
{
context.Result = new BadRequestObjectResult("Os parâmetros da requisição não foram informados.");
return;
}
foreach (var argument in parametros)
{
if (argument.Value == null)
{
context.Result = new BadRequestObjectResult($"Valor obrigatorio não informado {argument.Key}.");
return;
}
}
base.OnActionExecuting(context);
}
}
No código acima criei a classe AllRequiredInputValuesValidation conforme a documentação, herdando nossa classe ActionFilterAttribute, e dando um override na classe OnActionExecuting tendo como parâmetro um contexto do tipo ActionExecutingContext, através deste contexto consigo acessar todos os objetos e parâmetros de entrada do método de controller no qual este filtro é referenciado [AllRequiredInputValuesValidation], exemplo de uso desta classe:
[HttpGet]
[Route("v1/User/{IdUsuario:int}")]
[AllRequiredInputValuesValidation]
public async Task<IActionResult> GetUser(int IdUsuario)
{
# seu código;
}
meu método GET chamado GetUser recebe como atributo (estilo um decorator no python) a classe que criamos [AllRequiredInputValuesValidation], desta forma ela é instanciada e tem acesso aos parâmetros e também as injeções de dependência. em nossa classe [AllRequiredInputValuesValidation], validamos a existencia de parametros:
if (parametros == null)
{
context.Result = new BadRequestObjectResult("Os parâmetros da requisição não foram informados.");
return;
}
E caso exista parâmetros na requisição validamos um a um, percorrendo o dicionário que recebemos através do contexto: context.ActionArguments.
var parametros = context.ActionArguments;
percorrendo o dicionário na variável parametros:
foreach (var argument in parametros)
{
if (argument.Value == null)
{
context.Result = new BadRequestObjectResult($"Valor obrigatorio não informado {argument.Key}.");
return;
}
}
caso ele identifique algum parâmetro nulo, atribuímos no Result. do contexto, uma exception BadRequestObjectResult com detalhes do nosso campo obrigatório invalido.
Podemos filtrar também objetos compostos, segue exemplo abaixo:
var parametros = context.ActionArguments["SeuObjeto"] as EmissaDarfRequestViewModel;
if (parametros == null)
{
context.Result = new BadRequestObjectResult("Os parâmetros da requisição não foram informados.");
return;
}
if (parametros.Id == 0 ||
string.IsNullOrEmpty(parametros.ValorA) ||
string.IsNullOrEmpty(parametros.ValorB) ||
string.IsNullOrEmpty(parametros.ValorC))
{
context.Result = new BadRequestObjectResult("Parametros invalidos !");
return;
}
è um filtro bem simples porem o que mais gosto deste tipo de implementação é poder isolar da controller e das Actions o filtro aplicado nos campos e ao mesmo tempo com sua chamada tornamos explicito no código que ali existe uma validação, um middleware trabalhando.
Existe outras formas até mais interessantes de filtrar campos, com bibliotecas especificas para isso como a FluentValidation, que podem complementar validações em um ActionFilterAttribute. Espero que este artigo te ajude, bons estudos 🖖.
Comentários
Postar um comentário