ASP.NET MVC Entendendo Action Filters


Entendendo Action Filters

Um Action Filter é um atributo que você pode aplicar a uma Action de um controller,ou a um controller diretamente – o que modifica a maneira como essa action é executada.O framework MVC ja inclui muitos Action Filters

  • OutputCache – Esse action filter coloca o resultado de uma action em cache por um tempo determinado
  • Handle Error – Esse action filter manipula erros disparados durante a execução da action de um controller
  • Authorize – Esse action filter permite a você restringir acesso a um usuario ou role em particular

Você pode também criar seu próprio action filter.Por exemplo,você pode querer criar seu próprio action filter para implementar um sistema de autenticação personalizado.Ou,você pode querer criar um action filter que modifique a viewdata retornado por uma action de um controller.

Usando um action filter

Um action filter é um atributo.Você pode aplicar a maioria dos action filters para uma action ou diretamente para um controller inteiro.Por exemplo,o DataController abaixo contém uma action chamada Index que retorna a data atual.Essa action está decorada com o action filter OutputCache .Esse action filter faz com que o valor retornado pela action seja colocado em cache por 10 segundos.

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ê chamar repetidamente a action Index digitando a URL /Data/Index na barra de endereços do seu navegador e pressionando o botão de refresh varias vezes,você verá o mesmo horário durante 10 segundos.A saída da action Index é colocada em cache durante 10 segundos (figura 1):

No exemplo acima,um unico action filter – o OutputCache – é aplicado ao método Index.Se você precisar,você pode aplicar vários action filters diferentes a mesma action.Por exemplo,você pode querer aplicar os action filters OutputCache e HandleError para a mesma action.

No exemplo acima,o action filter está sendo aplicado diretamente na action Index,mas você também poderia ter aplicado diretamente ao controller.Nesse caso,todas as actions deste controller teriam suas saídas colocadas em cache durante 10 segundos.

Os diferentes tipos de filters

O ASP.NET MVC suporta quatro diferentes tipos de filters:

  1. Authorization filters – Implementa o atributo IAuthorizationFilter
  2. Action filters – Implementa o atributo IActionFilter
  3. Result filters – Implementa o atributo IResultFilter
  4. Exception filters – Implementa o atributo IExceptionFilter

Os filters são executados na ordem listada acima.Por exemplo,authorization filters são sempre executados antes de action filters e exception filters são sempre executados após qualquer outro tipo de filter.

Authorization Filters são usados para implementar autenticação e autorização para actions de um controller.Por exemplo,o Authorize filter é um exemplo do Authorization Filter.

Action Filters contém lógica que é executada antes e depois que a action de um controller é executada.Você pode usar um action filter,por exemplo,para modificar a ViewData que uma action retorna.

Result Filters contém lógica que é executada antes e depois da execução de um View Result.Por exemplo,você pode querer modificar um ViewResult um pouco antes da view ser renderizada para o navegador.

Exception Filters são os últimos tipo de filter que são executados.Você pode usar exception filters para tratar erros disparados pela suas actions ou pelo resultado das suas actions.Você também pode usa-lo para criar um log de erros.

Cada tipo diferente de filter é executado numa ordem em particular.Se você quiser modificar a ordem de execução de cada filter do mesmo tipo você pode setar a propriedade ORDER do filter.

A classe base para todos os filters é System.Web.Mvc.FilterAttribute.Se você quiser implementar um tipo particular de filter,então você precisa criar uma classe que herde dessa classe base e implemente uma ou mais das seguintes intefaces:IAuthorizationFilter,IActionFilter,IResultFilter ou IExceptionFilter.

<h3>A classe base ActionFilterAttribute</h3>

Pra facilitar a sua vida quando você quiser implementar um filter próprio,o ASP.NET MVC inclui uma classe base <em>ActionFilterAttribute</em>.Essa classe implementa as interfaces <em>IResultFilter</em> e <em>IActionFilter</em> herda da classe filter.

A terminologia aqui não é perfeitamente consistente.Tecnicamente,uma classe que herda da classe <em>ActionFilterAttribute</em> é tanto um Action Filter quanto um Result Filter.O termo Action Filter é usado para se referir a qualquer tipo de filter no ASP.NET MVC.

A classe <em>ActionFilterAttribute</em> possui os seguintes métodos que você pode sobrescrever:

  • OnActionExecuting – Esse método é chamado antes de uma action ser executada
  • OnActionExecuted – Esse método é chamado depois de uma action ser executada
  • OnResultExecuting – Esse método é chamado antes de uma action result ser executada
  • OnResultExecuting – Esse método é chamado depois de uma action result ser executada

Vamos ver como implementar esses métodos.

Criando um Action Filter de Log

Pra ilustrar como criar nosso próprio action filter,nós iremos criar um filter que registre os estágios de processo de uma action para a janela Output do Visual Studio.Segue abaixo:

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”);
}

}
}

Os métodos OnActionExecuting, OnActionExecuted,OnResultExecuting e OnResultExecuted chamam o método Log.O nome do método e a RouteData são passados para o método Log.O método Log escreve uma mensagem na janela output do Visual Studio conforme abaixo:

O HomeController abaixo ilustra como podemos aplicar o Log Action Filter para um controle inteiro.Quando qualquer das actions deste controle for chamada,(Index ou About) os estagios do processo de execução serão mostrados na janela Output do Visual Studio.

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();
}
}
}

É isso aí!Até a próxima pessoal!

Anúncios

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s