A maior rede de estudos do Brasil

Grátis
244 pág.
Desenvolvimento Web - MVC

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 }