ASP.NET MVC Filters – Utilizando o Action Filter

Bom, hoje eu vou falar um pouco sobre os Filters no asp.net mvc. Utilizar Filters é uma maneira de se trabalhar com o pré processamento e o pós processamento do seu controller e actions. Um exemplo clássico é você querer logar a chamada de uma determinada página, ou então restringir o acesso a determinadas áreas do seu sistema. Imagine a situação em que você precisa verificar se o usuário está logado para realizar determinada ação, porém você não quer poluir a sua action com validações, ou pior ainda, ficar duplicando código pelo seu projeto inteiro. Neste e nos próximos posts, falaremos de alguns tipos de filtros:

  • Action Filter
  • Exception Filter
  • Result Filter
  • Authorization Filter

Action Filter – IActionFilter

Com o Action Filter nós podemos interferir no comportamento da nossa action tanto antes como depois da sua execução. Para isso nós utilizamos a interface IActionFilter:

namespace System.Web.Mvc
{
    // Summary:
    //     Defines the methods that are used in an action filter.
    public interface IActionFilter
    {
        // Summary:
        //     Called after the action method executes.
        //
        // Parameters:
        //   filterContext:
        //     The filter context.
        void OnActionExecuted(ActionExecutedContext filterContext);
        //
        // Summary:
        //     Called before an action method executes.
        //
        // Parameters:
        //   filterContext:
        //     The filter context.
        void OnActionExecuting(ActionExecutingContext filterContext);
    }
}

Por exemplo, caso você queira utilizar um action filter para validar se um usuário está logado:

        public override void OnActionExecuting(ActionExecutingContext filterContext)
        {
            if (filterContext.HttpContext.Session["user"] == null)
            {
                filterContext.Result = new RedirectToRouteResult(new RouteValueDictionary(new { Controller = "Account", Action = "Login" }));
            }
        }
    }

É possível também estender a classe ActionFilterAttribute, que nada mais é do que uma classe abstrata que estende de FilterAttribute (outra classe abstrata) já ‘implementa’ tanto o IActionFilter quanto o IResultFilter:

namespace System.Web.Mvc
{
    // Summary:
    //     Represents the base class for filter attributes.
    [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited = true, AllowMultiple = false)]
    public abstract class ActionFilterAttribute : FilterAttribute, IActionFilter, IResultFilter
    {
        // Summary:
        //     Initializes a new instance of the System.Web.Mvc.ActionFilterAttribute class.
        protected ActionFilterAttribute();

        // Summary:
        //     Called by the ASP.NET MVC framework after the action method executes.
        //
        // Parameters:
        //   filterContext:
        //     The filter context.
        public virtual void OnActionExecuted(ActionExecutedContext filterContext);
        //
        // Summary:
        //     Called by the ASP.NET MVC framework before the action method executes.
        //
        // Parameters:
        //   filterContext:
        //     The filter context.
        public virtual void OnActionExecuting(ActionExecutingContext filterContext);
        //
        // Summary:
        //     Called by the ASP.NET MVC framework after the action result executes.
        //
        // Parameters:
        //   filterContext:
        //     The filter context.
        public virtual void OnResultExecuted(ResultExecutedContext filterContext);
        //
        // Summary:
        //     Called by the ASP.NET MVC framework before the action result executes.
        //
        // Parameters:
        //   filterContext:
        //     The filter context.
        public virtual void OnResultExecuting(ResultExecutingContext filterContext);
    }
}

A principal diferença que eu vejo na escolha entre herdar e implementar de FilterAttribute e IActionFilter e apenas herdar de ActionFilterAttribute é que no caso de usarmos o ActionFilterAttribute, a sua classe ficaria mais enxuta. Você precisaria fazer um override apenas do método que você pretende utilizar, enquanto implementando IActionFilter, você necessariamente precisa implementar todos os métodos. Um exemplo em que você quer utilizar apenas o OnActionExecuting:

Com ActionFilterAttribute

    public class SeuCustomFilter : ActionFilterAttribute
    {
        public override void OnActionExecuting(ActionExecutingContext filterContext)
        {
            // seu código aqui
        }
    }

Com FilterAttribute e IActionFilter

    public class SeuCustomFilter : FilterAttribute, IActionFilter
    {

        public void OnActionExecuted(ActionExecutedContext filterContext)
        {
            // ficará vazio
        }

        public void OnActionExecuting(ActionExecutingContext filterContext)
        {
            // seu código aqui
        }
    }

Bom, por hoje é só 😉
Segue alguns links de referência que podem te ajudar também:
Filtering in ASP.NET MVC
A Beginner’s Tutorial for Understanding Filters and Attributes in ASP.NET MVC
Abraço 😉

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