Desenvolvimento - C#

ASP.NET MVC Action Filters: HandleError, Authorize e OutputCache

Este artigo descreve sobre os Action Filters do ASP.NET MVC e mostra como podemos utilizar os Action Filters HandleError, Authorize e OutputCache.

por Pedro Henrique Barbosa Fernandes



Um Action Filter é um atributo que quando adicionado a uma action de um controller, altera a forma como a respectiva action é executada.

HandleError

O Action Filter HandleError é utilizado para redirecionar para uma página de erro customizada quando algum erro é disparado pela action do controller.

[HandleError]
public class HomeController : Controller
{
    public ActionResult Index()
    {
        throw new NullReferenceException();
    }

    public ActionResult About()
    {
        return View();
    }
}
Quando acontecer o erro NullReferenceException na action Index, o ASP.NET MVC irá procurar na pasta das views daquele controller uma view chamada “Error” e renderiza-la para o usuário. Quando a view chamada “Error” estiver na pasta “Shared”, será compartilhada com todos os controllers da aplicação.

Podemos também, redirecionar para páginas de erros específicas para cada tipo de erro:

[HandleError(ExceptionType = typeof(NullReferenceException),
     View = "NullError")]
[HandleError(ExceptionType = typeof(SecurityException),
     View = "SecurityError")]
public class HomeController : Controller
{
    public ActionResult Index()
    {
        throw new NullReferenceException();
    }

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

Authorize

Este Action Filter é um dos mais importantes, pois serve para definirmos as diretrizes de segurança da aplicação, com ele é possível determinar quais usuários ou grupos de usuários terão acesso a determinadas actions do controller.

public class HomeController : Controller
{
    public ActionResult Index()
    {
        return View();
    }

    [Authorize]
    public ActionResult About()
    {
        return View();
    }
}
Este código acima, determina que apenas usuários logados podem entrar na action About(). Qualquer acesso não autorizado será redirecionado para a página de login.

Também é possível definir uma segurança baseada em grupos de usuários:

public class HomeController : Controller
{
    public ActionResult Index()
    {
        return View();
    }

    [Authorize(Roles="Admin, Funcionarios")]
    public ActionResult About()
    {
        return View();
    }
}
Somente usuários do grupo Admin e Funcionarios tem acesso a action About().

public class HomeController : Controller
{
    public ActionResult Index()
    {
        return View();
    }

    [Authorize(Users = "Pedro, Olga")]
    public ActionResult About()
    {
        return View();
    }
}
Somente o usuário Pedro e a usuária Olga podem acessar a action About().

OutputCache

Este ActionFilter habilita o cache das actions dos controllers, útil para quando determinadas páginas não mudam com freqüencia e torna desnecessário fazer todo o processamento diversas vezes.

public class HomeController : Controller
{
    [OutputCache(Duration = 15)]
    public ActionResult Index()
    {
        return DateTime.Now;
    }

    public ActionResult About()
    {
        return View();
    }
}
Ao executar a action acima, será exibida na tela a hora atual. E durante 15 segundos você verá a mesma data e hora, isso porque o resultado da action foi colocado no cache e é reaproveitado em vez de executar a action novamente, se este Acion Filter for usado corretamente, é possível ter uma melhora significativa de desempenho da aplicação.
Pedro Henrique Barbosa Fernandes

Pedro Henrique Barbosa Fernandes