244 pág.

Pré-visualização | Página 31 de 41
info = string.Format("Duração total: {0} ms", duration.ElapsedMilliseconds←- ); 13 filterContext.HttpContext.Response.Write(info); 14 } 15 } Código C# 10.22: ElapsedTimeAttribute.cs Para aplicar o filtro, basta adicionar a anotação ElapsedTime no controlador ou na ação. 1 ... 2 3 [ElapsedTime] 4 public ActionResult Index() 5 { 6 return View(db.Produtos.ToList ()); 7 } 8 9 ... Código C# 10.23: ProdutoController.cs Ao acessar o seguinte endereço http://localhost:<PORTA_APP>/produto, podemos visualizar a duração entre a execução da ação e a geração do resultado. www.facebook.com/k19treinamentos 175 FILTROS 176 Exercícios de Fixação 14 Adicione ao projeto Filtros um filtro para medir o tempo entre a execução de uma ação e a geração do resultado. Dica: Utilize a classe ActionFilterAttribute para criar o filtro. 1 namespace Filtros.Filters 2 { 3 public class ElapsedTimeAttribute : ActionFilterAttribute 4 { 5 private Stopwatch duration; 6 public override void OnActionExecuting(ActionExecutingContext filterContext) 7 { 8 this.duration = Stopwatch.StartNew (); 9 } 10 11 public override void OnResultExecuted(ResultExecutedContext filterContext) 12 { 13 this.duration.Stop(); 14 string info = string.Format("Duração total: {0} ms", duration.←- ElapsedMilliseconds); 15 filterContext.HttpContext.Response.Write(info); 16 } 17 } 18 } Código C# 10.24: ElapsedTimeAttribute.cs 15 Adicione o filtro ElapsedTimeAttribute à ação Index do controlador Produto. Para adicionar o filtro, basta acrescentar a anotação [ElapsedTime]. 1 public class ProdutoController : Controller 2 { 3 ... 4 5 [ElapsedTime] 6 public ActionResult Index() 7 { 8 return View(db.Produtos.ToList ()); 9 10 } 11 12 ... 13 14 } Código C# 10.25: ProdutoController.cs Acesse o seguinte endereço: http://localhost:<PORTA_APP>/produto. Verifique que a dura- ção do tempo entre a execução da ação e a geração do resultado é mostrada na tela. Filtro de Exceção Os filtros de exceção são executados quando ocorrem exceções nas ações ou nos filtros. Os filtros de exceção devem implementar a interface IExceptionFilter. 176 www.k19.com.br 177 FILTROS 1 public interface IExceptionFilter 2 { 3 void OnException(ExceptionContext filterContext); 4 } Código C# 10.26: IExceptionFilter.cs O ASP .NET MVC contém a classe HandleErrorAttribute que é uma implementação padrão de IExceptionFilter. O filtro HandleErrorAttribute retorna a página Error localizada na pasta Views/Shared quando ocorre uma exceção. Através da HandleErrorAttribute podemos alterar a página de erro retornada de acordo com o tipo de exceção. 1 [HandleError(ExceptionType=typeof(InvalidOperationException), 2 View="OperacaoInvalida")] 3 [HandleError] 4 public ActionResult Index() 5 { 6 return View(db.Produtos.ToList ()); 7 } Código C# 10.27: ProdutoController.cs No exemplo acima, a primeira anotação filtrará os erros do tipo InvalidOperationException e retornará a página OperacaoInvalida da pasta Views/Shared. A segunda anotação filtrará todas as exceções e retornará a página padrão Error da pasta Views/Shared. É necessário habilitar o ele- mento customErrors no arquivo Web.config para o filtro HandleErrorAttribute funcionar. Exercícios de Fixação 16 Altere o controlador Produto do projeto Filtros. Acrescente uma ação para visualizar um pro- duto de uma lista através de uma posição. A ação deverá receber como parâmetro a posição, que será definida pelo usuário através da url. 1 public ActionResult Visualizar(int posicao) 2 { 3 List <Produto > produtos = db.Produtos.ToList (); 4 return View(produtos[posicao ]); 5 } Código C# 10.28: ProdutoController.cs 17 Defina uma página para mostrar os dados do produto que foi selecionado de acordo com a posição. 1 @model Filtros.Models.Produto 2 3 @{ 4 ViewBag.Title = "Visualizar"; 5 } 6 7 <h2>Visualizar </h2> 8 9 <fieldset > 10 <legend >Produto </legend > www.facebook.com/k19treinamentos 177 FILTROS 178 11 12 <div class="display -label"> 13 @Html.DisplayNameFor(model => model.Nome) 14 </div> 15 <div class="display -field"> 16 @Html.DisplayFor(model => model.Nome) 17 </div> 18 19 <div class="display -label"> 20 @Html.DisplayNameFor(model => model.Preco) 21 </div> 22 <div class="display -field"> 23 @Html.DisplayFor(model => model.Preco) 24 </div> 25 </fieldset > 26 <p> 27 @Html.ActionLink("Back to List", "Index") 28 </p> Código CSHTML 10.5: Visualizar.cshtml Verifique o funcionamento da ação Visualizar, acessando os seguintes endereços: http://localhost:<PORTA_APP>/produto/visualizar?posicao=0 http://localhost:<PORTA_APP>/produto/visualizar?posicao=1 http://localhost:<PORTA_APP>/produto/visualizar?posicao=-1 Ao acessarmos uma posição inválida, ocorrerá a seguinte exceção: 18 Adicione um filtro para tratar a exceção do tipo ArgumentOutOfRangeException. 1 [HandleError(ExceptionType=typeof(ArgumentOutOfRangeException), 2 View ="PosicaoInvalida")] 3 public ActionResult Visualizar(int posicao) 4 { 5 List <Produto > produtos = db.Produtos.ToList (); 6 return View(produtos[posicao ]); 7 } Código C# 10.29: ProdutoController.cs 178 www.k19.com.br 179 FILTROS 19 Crie a página PosicaoInvalida na pasta Views/Shared. 1 @{ 2 ViewBag.Title = "Posição Inválida"; 3 } 4 5 <h2>Você acessou uma posição inválida.</h2> Código CSHTML 10.6: PosicaoInvalida.cshtml 20 Para o filtro HandlerErrorAttribute funcionar, habilite o elemento customErrors no arquivo Web.config. 1 <system.web> 2 <customErrors mode="On"/> 3 ... 4 </system.web> Código XML 10.3: Web.config Acesse o seguinte endereço: http://localhost:<PORTA_APP>/produto/visualizar?posicao=-1 O filtro deverá redirecioná-lo para a tela PosicaoInvalida. www.facebook.com/k19treinamentos 179 FILTROS 180 180 www.k19.com.br TRATAMENTO DE ERROS C A P Í T U L O 11 Inevitavelmente, as aplicações estão sujeitas a erros de várias naturezas. Por exemplo, erros po- dem ser gerados pelo preenchimento incorreto dos campos de um formulário. Esse tipo de erro é causado por falhas dos usuários. Nesse caso, é importante mostrar mensagens informativas com o intuito de fazer o próprio usuário corrigir os valores preenchidos incorretamente. Veja o Capítulo 8. Por outro lado, há erros que não são causados por falhas dos usuários. Por exemplo, um erro de conexão com o banco de dados. Nesses casos, é improvável que os usuários possam fazer algo que resolva o problema. E mesmo que pudessem, provavelmente, não seria conveniente esperar que eles o fizessem. Quando um erro desse tipo ocorre, o ASP.NET MVC cria uma página web com informações so- bre o erro e a envia aos usuários. Para usuários locais, o ASP.NET MVC envia uma página web com informações detalhadas do erro ocorrido. Para usuários remotos, a página web enviada não contém informações detalhadas. Em geral, não é conveniente que os usuários recebam detalhes técnicos sobre os erros gerados por falhas da aplicação. A primeira justificativa é que esses detalhes podem confundir os usuários. Figura 11.1: Exemplo de uma página web com informações sobre um erro www.facebook.com/k19treinamentos 181 TRATAMENTO DE ERROS 182 A segunda justificativa é que esses detalhes podem expor alguma falha de segurança da aplicação, deixando-a mais vulnerável a ataques. Try-Catch Os erros de aplicação podem ser identificados através do comando try-catch, que pode ser colocados nos métodos que definem as ações dos controladores. Ao identificar a ocorrência de um erro, os controladores podem devolver uma página web com alguma mensagem para o usuário. 1 ... 2 [HttpPost] 3 public ActionResult Salva(Editora editora) 4 { 5 try 6 { 7 db.Editoras.Add(editora); 8 } 9 catch 10 { 11 return View("Error"); 12 } 13 14 return RedirectToAction("Index"); 15 }