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