t

Comentários recentes

Recursos para criação de Custom Filter

Postado por Daniel Fonseca Castro - Tuesday, December 01, 2009 8:04 AM

Esse post é continuação dos posts:

ASP.NET MVC – Entendendo os Actions Filters

ASP.NET MVC – Action Filters

Como o próprio nome sugere Custom Filter são Filter customizado e antes de criar o nosso Custom Filter precisamos conhecer os recursos disponíveis para isso.Todos os Filters herdam da classe FilterAttribute e implementam pelo menos uma das seguintes interfaces: IAuthorizationFilter, IActionFilter, IResultFilter e IExceptionFilter.

O AuthorizeAttribute implementa a interface IAuthorizationFilter, o OutputCacheAttribute herda da classe ActionFilterAttribute que implementa as interfaces IActionFilter e IResultFilter, por fim o HandleErrorAttribute implementa a interface IExceptionFilter.

IActionFilter e IResultFilter

A interface IActionFilter define os métodos OnActionExecuting e OnActionExecuted, a interface IResultFilter define os métodos OnResultExecuting e OnResultExecuted.

OnActionExecuting

O método OnActionExecuting é executado logo após a criação do Controller, antes mesmo da execução da action, você pode utilizá-lo para definir se a action pode ou não ser executada e conforme a decisão cancelar a execução da action. Para fazer isso você simplesmente tem que passar um valor para a propriedade Result da instância da classe ActionExecutingContext recebida como parâmetro.

Veja um exemplo de como cancelar a execução de uma Action no código abaixo.

public class CustomFilterAttribute : FilterAttribute, IActionFilter
{
    public void OnActionExecuting(ActionExecutingContext filterContext)
    {
        filterContext.Result = new RedirectResult("~/Home/Index");
    }
    public void OnActionExecuted(ActionExecutedContext filterContext) { }
}

O código acima cancela a execução da Action e redireciona o usuário para a Action Index do Controller Home.

OnActionExecuted

O método OnActionExecuted é chamado após a execução da Action, esse método não é chamado quando a Action for cancelada antes de sua execução, como no exemplo acima , esse método recebe como parâmetro uma instância da classe ActionExecutedContext, você pode utilizar esse método para recuperar o retorno da action e fazer algum tipo de auditoria.

O exemplo abaixo mostra como você pode utilizar o método OnActionExecuted para verificar o tipo de retorno da Action, nesse exemplo utilizei a janela Output do Visual Studio para mostrar o resultado.

public class CustomFilterAttribute : FilterAttribute, IActionFilter
{
    public void OnActionExecuted(ActionExecutedContext filterContext)
    {
        if (filterContext.Result is ViewResult)
            System.Diagnostics.Debug.WriteLine("O retorno é do tipo ViewResult.");
        else if (filterContext.Result is ContentResult)
            System.Diagnostics.Debug.WriteLine("O retorno é do tipo ContentResult.");
        else if (filterContext.Result is RedirectResult)
            System.Diagnostics.Debug.WriteLine("O retorno é do tipo RedirectResult.");
    }
    public void OnActionExecuting(ActionExecutingContext filterContext) { }
}

OnResultExecuting

O método OnResultExecuting é chamado antes do resultado ser entregue. Você pode por exemplo utilizar esse método para cancelar o resultado gerado. Ele recebe como parâmetro uma instância da classe ResultExecutingContext que possui duas propriedades: Result e Cancel. A propriedade Result já conhecemos e a propriedade Cancel é do tipo booleano e pode ser utilizada para cancelar o resultado.

O exemplo abaixo cancela o retorno para o usuário passando true para propriedade Cancel. Nesse caso uma página em branco será exibida para o usuário. É importante salientar que a Action foi executada, e o que estamos cancelando é apenas o retorno.

public class CustomFilterAttribute : FilterAttribute, IResultFilter
{
    public void OnResultExecuting(ResultExecutingContext filterContext)
    {
        filterContext.Cancel = true;
    }
    public void OnResultExecuted(ResultExecutedContext filterContext) { }
}

OnResultExecuted

O método OnResultExecuted é o último método executado antes do resultado ser entregue para o cliente se você quiser por exemplo verificar se tudo funcionou perfeitamente durante a execução de uma Action você pode utilizar esse método, ele só não será executado caso o resultado seja cancelado no método OnResultExecuting. Esse método recebe como parâmetro uma instância da classe ResultExecutedContext.

No exemplo abaixo, verifico se a propriedade Exception é igual a null e se a condição for atendida utilizo a janela Output do Visual Studio para mostrar a seguinte frase “ Nenhuma Exception foi gerada durante a execução da ‘Action NomedaAction’!”.

public class CustomFilterAttribute : FilterAttribute, IResultFilter
{
    public void OnResultExecuted(ResultExecutedContext filterContext)
    {
        if (filterContext.Exception == null)
        {
            System.Diagnostics.Debug.WriteLine(String.Format("Nenhuma Exception foi gerada durante a execução da Action {0}!", 
            filterContext.RouteData.Values.Where(x => x.Key == "action").FirstOrDefault().Value.ToString()));
        }
    }
    public void OnResultExecuting(ResultExecutingContext filterContext) { }
}

IAuthorizationFilter

Para criar um Authorization Filter você deve utilizar a interface IAuthorizationFilter e herdar da classe abstrata FilterAttribute. A interface IAuthorizationFilter define apenas um método OnAuthorization. O método OnAuthorization recebe apenas um parâmetro que é uma instância da classe AuthorizationContext. Esse método é executado antes da Action e assim você pode autorizar ou não a execução da Action. Esse método funciona de forma similar ao método OnActionExecuting da interface IActionFilter discutida anteriormente.

No exemplo abaixo crio um filter que cancela a execução da Action retornando uma mensagem de manutenção.

public class ManutencaoAttribute : FilterAttribute, IAuthorizationFilter
{
    public void OnAuthorization(AuthorizationContext filterContext)
    {
        filterContext.Result = new ContentResult { Content = "Site em manutenção" };
    }
}

IExceptionFilter

Para criar um Exception Filter você deve implementar a interface IExceptionFilter e herdar da classe abstrata FilterAttribute. A interface IExceptionFilter define apenas um método OnException. O método OnException recebe como parâmetro uma instância da classe ExceptionContext. Esse método é executado somente quando uma exceção for lançada pela Action. A exceção pode ser recuperada através da propriedade Exception da classe ExceptionContext.

No exemplo abaixo, simplesmente mostro a mensagem de erro na janela Output do Visual Studio.

public class ExceptionFilterAttribute : FilterAttribute, IExceptionFilter
{
    public void OnException(ExceptionContext filterContext)
    {
        if (filterContext.Exception != null)
            System.Diagnostics.Debug.WriteLine(filterContext.Exception.Message);
    }
}

No próximo post vamos criar um Custom filter utilizando a classe ActionFilterAttribute.

Daniel Fonseca Castro

Currently rated 5.0 by 2 people

  • Currently 5/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5

Categories: ASP.NET MVC

Related posts

Add comment


 

  Country flag