Pesquisar

Acompanhe

http://twitter.com/dfcdaniel Feed

Posts recentes

Comentários recentes

ASP.NET MVC – Action Filters

Esse post e continuação do post ASP.NET MVC - Entendendo os Actions Filters, vamos falar dos três filters existentes dentro do framework.

AuthorizeAttribute

O AuthorizeAttribute restringe acesso a uma Action e se aplicado no Controller restringe acesso a todas as Actions.

[Authorize()]
public class ClienteController : Controller
{
    public ActionResult Index(){return View();}

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

No exemplo acima, qualquer usuário devidamente autenticado pode acessar as Actions. Caso um usuário não autenticado tente acessar uma das Actions o Filter tem a responsabilidade de retornar para o usuário o erro de servidor “401 Unauthorized”. Como o template padrão do ASP.NET MVC utiliza autenticação por “Forms”, nesse caso o usuário será redirecionado para a página de login.

O AuthorizeAttribute possui duas propriedades: Rules e Users. Veja o exemplo abaixo.

public class ClienteController : Controller
{
    [Authorize(Roles="Administradores")]
    public ActionResult Index() { return View(); }

    [Authorize(Users="Daniel")]
    public ActionResult Details() { return View(); }
}

No exemplo a acima, a Action Index só poderá ser acessada por um usuário que faça parte do grupo de Administradores,e a Action Details somente pelo usuário “Daniel”. Você ainda pode adicionar vários Roles ou Users separando os valores por vírgula.

OutputCacheAttribute

O OutputCacheAttribute é utilizado para fazer cache de dados, e para fazer esse cache utiliza os recursos existente do ASP.NET, onde o cache pode ser configurado diretamente em uma página .ASPX a partir da diretiva @OutputCache. Entretanto, o mesmo não pode ser feito em uma aplicação ASP.NET MVC porque as Actions são executadas antes das Views, por isso, colocar o cache na View não faria nenhum sentido. Veja um exemplo de cache com o atributo OutputCache abaixo.

[OutputCache(Duration = 60,VaryByParam="none")]
public ActionResult Index()
{
    ViewData["Mensagem"] = "Último Cache : " + DateTime.Now.ToLongTimeString();
    return View();
}

O código acima, cria um cache para a Action Index com as configurações mínimas Duration e VaryByParam. Duration define o tempo de vida do cache em segundos e VaryByParam define qual parâmetro deve gerar uma nova versão do cachê,nesse exemplo o valor “none” diz que nenhum valor deve ser considerado, ou seja, o cache será o mesmo independente dos parâmetros informados.Você pode também fazer todas as configurações de cache no web.config e fazer uma referência à configuração através da propriedade CacheProfile, conforme o exemplo a baixo.

<system.web>
  <caching>
    <outputCacheSettings>
      <outputCacheProfiles>
        <add name="MeuCache" duration="60" varyByParam="none"/>
      </outputCacheProfiles>
    </outputCacheSettings>
  </caching>
</system.web>
		
[OutputCache(CacheProfile = "MeuCache")]
public ActionResult Index(int? id)
{
    ViewData["Mensagem"] = "Último Cache : " + DateTime.Now.ToLongTimeString();
    return View();
}

O código da acima é muito parecido com o exemplo anterior, a diferença esta na configurações do cache que foi definida no web.config.

HandleErrorAttribute

O HandleErrorAttribute é o Filter para tratamento de Exceptions seu funcionamento é muito simples: qualquer Exception lançada por uma Action será tratada por esse Filter, sendo que por padrão o Filter procura uma View de nome Error e exibe para o usuário (o template de projeto padrão inclui uma View “Error.aspx” dentro da pasta Shared).

Esse atributo possui quatro propriedades:

ExceptionType: que define o tipo de exception que você deseja tratar (se nenhum valor for informado todas as Exceptions serão tratados).

Master: que define o nome da MasterPage que deve ser utilizada.

View: que define o nome da View que deve ser exibida (se nenhum valor for informado para essa propriedade, a View Error será utilizada).

Order: que defini a ordem de execução dos filters.

Veja um exemplo abaixo.

[HandleError(Order = 2)]
public class ClienteController : Controller
{
    [HandleError(View = "MinhaPaginaErro", ExceptionType = typeof(ArgumentException), Order = 1)]
    public ActionResult Details(int? id)
    {
        if (id == null)
            throw new ArgumentNullException("id invalido.");

        return View();
    }

    public ActionResult Delete(int? id)
    {
        if (id == null)
            throw new ArgumentNullException ("id invalido.");

        return View();
    }
}

O código a acima mostra um exemplo de como você pode utilizar o Filter HandleError no Controller e nas Actions. Note que o Controller possui um Filter para tratamento de erro que será o mais genérico de todos e a Action Details possui seu próprio Filter para tratamento de erros. O Filter da Action Details foi configurado para exibir a View “MinhaPaginaErro” toda vez que a Action lançar uma Exception do tipo ArgumentException. Quando uma Exception de outro tipo for lançada, essa será tratada pelo Filter mais genérico. A Action “Delete” não possui nenhum Filter e por isso todas as Exceptions lançadas por ela serão tratadas pelo Filter mais genérico.

A propriedade Order configuradas nos Filter define a ordem de execução dos Filter, nesse exemplo o Filter do Controller foi configurado com um valor mais alto do que o valor do Filter da Action “Details”, isso porque ele é o mais genérico de todos.

No próximo post vamos discutir como criar um Custom Filter.

Daniel Fonseca Castro

Currently rated 5.0 by 2 people

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

Categories: ASP.NET MVC
Postado por Daniel Fonseca Castro - Saturday, November 28, 2009 8:10 AM
Permalink | Comments (0) | Post RSSRSS comment feed

Related posts

Add comment


 

  Country flag

[b][/b] - [i][/i] - [u][/u]- [quote][/quote]