Noções básicas sobre filtros de ação (C#)

pela Microsoft

Baixar PDF

O objetivo deste tutorial é explicar os filtros de ação. Um filtro de ação é um atributo que você pode aplicar a uma ação do controlador ou a um controlador inteiro que modifica a maneira como a ação é executada.

Noções básicas sobre filtros de ação

O objetivo deste tutorial é explicar os filtros de ação. Um filtro de ação é um atributo que você pode aplicar a uma ação do controlador ou a um controlador inteiro que modifica a maneira como a ação é executada. A estrutura ASP.NET MVC inclui vários filtros de ação:

  • OutputCache – esse filtro de ação armazena em cache a saída de uma ação do controlador por um período de tempo especificado.
  • HandleError – esse filtro de ação lida com erros gerados quando uma ação do controlador é executada.
  • Autorizar – esse filtro de ação permite restringir o acesso a um determinado usuário ou função.

Você também pode criar seus próprios filtros de ação personalizados. Por exemplo, talvez você queira criar um filtro de ação personalizado para implementar um sistema de autenticação personalizado. Ou talvez você queira criar um filtro de ação que modifique os dados de exibição retornados por uma ação do controlador.

Neste tutorial, você aprenderá a criar um filtro de ação do zero. Criamos um filtro de ação log que registra diferentes estágios do processamento de uma ação na janela Saída do Visual Studio.

Usando um filtro de ação

Um filtro de ação é um atributo. Você pode aplicar a maioria dos filtros de ação a uma ação de controlador individual ou a um controlador inteiro.

Por exemplo, o controlador de dados na Listagem 1 expõe uma ação chamada Index() que retorna a hora atual. Essa ação é decorada com o OutputCache filtro de ação. Esse filtro faz com que o valor retornado pela ação seja armazenado em cache por 10 segundos.

Listagem 1 – Controllers\DataController.cs

using System;
using System.Web.Mvc;

namespace MvcApplication1.Controllers
{
     public class DataController : Controller
     {
          [OutputCache(Duration=10)]
          public string Index()
          {
               return DateTime.Now.ToString("T");
          }
     }
}

Se você invocar repetidamente a ação Index() inserindo a URL /Data/Index na barra de endereços do navegador e pressionando o botão Atualizar várias vezes, você verá o mesmo tempo por 10 segundos. A saída da ação Index() é armazenada em cache por 10 segundos (consulte a Figura 1).

Tempo armazenado em cache

Figura 01: Tempo armazenado em cache (clique para exibir a imagem em tamanho real)

Na Listagem 1, um único filtro de ação – o OutputCache filtro de ação – é aplicado ao Index() método . Se precisar, você poderá aplicar vários filtros de ação à mesma ação. Por exemplo, talvez você queira aplicar os OutputCache filtros de ação e HandleError à mesma ação.

Na Listagem 1, o OutputCache filtro de ação é aplicado à ação Index() . Você também pode aplicar esse atributo à DataController própria classe. Nesse caso, o resultado retornado por qualquer ação exposta pelo controlador seria armazenado em cache por 10 segundos.

Os diferentes tipos de filtros

A estrutura ASP.NET MVC dá suporte a quatro tipos diferentes de filtros:

  1. Filtros de autorização – implementa o IAuthorizationFilter atributo .
  2. Filtros de ação – implementa o IActionFilter atributo .
  3. Filtros de resultado – implementa o IResultFilter atributo .
  4. Filtros de exceção – implementa o IExceptionFilter atributo .

Os filtros são executados na ordem listada acima. Por exemplo, os filtros de autorização são sempre executados antes que os filtros de ação e os filtros de exceção sejam sempre executados após todos os outros tipos de filtro.

Os filtros de autorização são usados para implementar autenticação e autorização para ações do controlador. Por exemplo, o filtro Autorizar é um exemplo de um filtro de autorização.

Os filtros de ação contêm a lógica executada antes e depois da execução de uma ação do controlador. Você pode usar um filtro de ação, por exemplo, para modificar os dados de exibição retornados por uma ação do controlador.

Os filtros de resultado contêm a lógica executada antes e depois que um resultado de exibição é executado. Por exemplo, talvez você queira modificar um resultado de exibição antes que o modo de exibição seja renderizado no navegador.

Os filtros de exceção são o último tipo de filtro a ser executado. Você pode usar um filtro de exceção para lidar com erros gerados pelas ações do controlador ou pelos resultados da ação do controlador. Você também pode usar filtros de exceção para registrar erros.

Cada tipo diferente de filtro é executado em uma ordem específica. Se você quiser controlar a ordem na qual os filtros do mesmo tipo são executados, poderá definir a propriedade Order de um filtro.

A classe base para todos os filtros de ação é a System.Web.Mvc.FilterAttribute classe . Se você quiser implementar um tipo específico de filtro, precisará criar uma classe que herde da classe base Filter e implemente uma ou mais interfaces IAuthorizationFilter, IActionFilter, IResultFilterou IExceptionFilter .

A classe Base ActionFilterAttribute

Para facilitar a implementação de um filtro de ação personalizado, o ASP.NET estrutura MVC inclui uma classe base ActionFilterAttribute . Essa classe implementa as IActionFilter interfaces e IResultFilter e herda da Filter classe .

A terminologia aqui não é totalmente consistente. Tecnicamente, uma classe que herda da classe ActionFilterAttribute é um filtro de ação e um filtro de resultado. No entanto, no sentido flexível, a palavra filtro de ação é usada para se referir a qualquer tipo de filtro na estrutura MVC ASP.NET.

A classe base ActionFilterAttribute tem os seguintes métodos que você pode substituir:

  • OnActionExecuting – esse método é chamado antes da execução de uma ação do controlador.
  • OnActionExecuted – esse método é chamado depois que uma ação do controlador é executada.
  • OnResultExecuting – esse método é chamado antes da execução de um resultado de ação do controlador.
  • OnResultExecuted – esse método é chamado depois que um resultado de ação do controlador é executado.

Na próxima seção, veremos como você pode implementar cada um desses métodos diferentes.

Criando um filtro de ação de log

Para ilustrar como você pode criar um filtro de ação personalizado, criaremos um filtro de ação personalizado que registra os estágios de processamento de uma ação do controlador na janela Saída do Visual Studio. Nosso LogActionFilter está contido na Listagem 2.

Listagem 2 – ActionFilters\LogActionFilter.cs

using System;
using System.Diagnostics;
using System.Web.Mvc;
using System.Web.Routing;

namespace MvcApplication1.ActionFilters
{
     public class LogActionFilter : ActionFilterAttribute

     {
          public override void OnActionExecuting(ActionExecutingContext filterContext)
          {
               Log("OnActionExecuting", filterContext.RouteData);       
          }

          public override void OnActionExecuted(ActionExecutedContext filterContext)
          {
               Log("OnActionExecuted", filterContext.RouteData);       
          }

          public override void OnResultExecuting(ResultExecutingContext filterContext)
          {
               Log("OnResultExecuting", filterContext.RouteData);       
          }

          public override void OnResultExecuted(ResultExecutedContext filterContext)
          {
               Log("OnResultExecuted", filterContext.RouteData);       
          }


          private void Log(string methodName, RouteData routeData)
          {
               var controllerName = routeData.Values["controller"];
               var actionName = routeData.Values["action"];
               var message = String.Format("{0} controller:{1} action:{2}", methodName, controllerName, actionName);
               Debug.WriteLine(message, "Action Filter Log");
          }

     }
}

Na Listagem 2, os OnActionExecuting()métodos , OnActionExecuted()OnResultExecuting(), e OnResultExecuted() chamam o Log() método . O nome do método e os dados de rota atuais são passados para o Log() método . O Log() método grava uma mensagem na janela Saída do Visual Studio (consulte a Figura 2).

Gravando na janela Saída do Visual Studio

Figura 02: Gravando na janela Saída do Visual Studio (clique para exibir a imagem em tamanho real)

O controlador Home na Listagem 3 ilustra como você pode aplicar o filtro de ação Log a uma classe de controlador inteira. Sempre que qualquer uma das ações expostas pelo controlador Home é invocada – o Index() método ou o About() método – os estágios de processamento da ação são registrados na janela Saída do Visual Studio.

Listagem 3 – Controllers\HomeController.cs

using System.Web.Mvc;
using MvcApplication1.ActionFilters;

namespace MvcApplication1.Controllers
{
     [LogActionFilter]
     public class HomeController : Controller
     {
          public ActionResult Index()
          {
               return View();
          }

          public ActionResult About()
          {
               return View();
          }
     }
}

Resumo

Neste tutorial, você foi apresentado a ASP.NET filtros de ação MVC. Você aprendeu sobre os quatro tipos diferentes de filtros: filtros de autorização, filtros de ação, filtros de resultados e filtros de exceção. Você também aprendeu sobre a classe base ActionFilterAttribute .

Por fim, você aprendeu a implementar um filtro de ação simples. Criamos um filtro de ação de log que registra os estágios de processamento de uma ação do controlador na janela Saída do Visual Studio.