A maior rede de estudos do Brasil

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

Pré-visualização | Página 24 de 41

acessando a url http://localhost:<PORTA_APP>/Produto/Cadastra. Verifi-
que que a mensagem de sucesso aparecerá.
Rotas
www.facebook.com/k19treinamentos 137
CAMADA DE CONTROLE 138
Para acessar uma determinada ação da nossa aplicação, os usuários devem realizar uma requi-
sição HTTP utilizando a url correspondente à ação. Por exemplo, para acessar a listagem de edito-
ras, é necessário digitar na barra de endereço do navegador a url http://localhost:<PORTA_APP>
/Editora/Index. Perceba que o o nome do controlador e o nome da ação desejados fazem parte da
url. O formato dessas urls é definido por rotas criadas no arquivo RouteConfig.cs e carregadas no
arquivo Global.asax. O código abaixo mostra a rota padrão inserida nos projetos ASP.NET MVC 4.
1 routes.MapRoute(
2 name: "Default",
3 url: "{controller }/{ action }/{id}",
4 defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
5 );
Código C# 7.24: RouteConfig.cs
O primeiro argumento do método MapRoute é o nome da rota, o segundo é a expressão que define
o formato da rota e o terceiro é o conjunto de valores padrão dos parâmetros da rota.
A expressão que determina o formato da rota Defaultutiliza três parâmetros: controller, action
e id. Dessa forma, se o usuário realizar uma requisição HTTP utilizando url http://localhost:
<PORTA_APP>/Editora/Remove/1, o ASP.NET MVC criará uma instância do controlador Editora e
executará o método Remove() passando o valor 1 como argumento.
Basicamente, as rotas associam urls e ações. Veja alguns exemplos de como as urls serão proces-
sadas de acordo com as regras de rotas.
URL Mapeamento da URL
/ controller = "Home", action = "Index"
/Livro controller = "Livro", action = "Index"
/Livro/Adiciona controller = "Livro", action = "Adiciona"
/Livro/Remove/1 controller = "Livro", action = "Remove", id = 1
Adicionando uma rota
Para acrescentar uma rota, podemos utilizar o método MapRoute(). Suponha que a listagem de
editoras deva ser acessada através da url http://localhost:<PORTA_APP>/Catalogo. Nesse caso,
podemos adicionar uma rota no arquivo RoutesConfig.cs, como mostrado abaixo.
1 ...
2 routes.MapRoute(
3 name: "Nova Rota",
4 url: "Catalogo",
5 defaults: new { controller = "Editora", action = "Index" }
6 );
7 ...
Código C# 7.25: RoutesConfig.cs
Importante
As rotas são processadas na ordem em que foram inseridas. Portanto, é importante
definir as rotas mais específicas antes das rotas mais genéricas.
138 www.k19.com.br
139 CAMADA DE CONTROLE
Adicionando Parâmetros nas Rotas
Podemos acrescentar parâmetros às rotas. Por exemplo, na rota criada anteriormente para a
listagem de editoras, poderíamos adicionar um parâmetro para limitar a quantidade de editoras lis-
tadas.
1 routes.MapRoute(
2 name: "Nova Rota",
3 url: "Catalogo /{ maximo}",
4 defaults: new { controller = "Editora", action = "Index" }
5 );
Código C# 7.26: RoutesConfig.cs
Por padrão, os parâmetros adicionados a uma rota são obrigatórios. Dessa forma, no exemplo
acima, a listagem de editoras só poderá ser acessada se o valor do parâmetro maximo for definido na
url da requisição. Por exemplo, http://localhost:<PORTA_APP>/Catalogo/20. Se uma requisição
for realizada para a url http://localhost:<PORTA_APP>/Catalogo, um erro ocorrerá. Para mudar
esse comportamento, podemos tornar o parâmetro maximo opcional. Veja o código a seguir.
1 ...
2 routes.MapRoute(
3 name: "Nova Rota",
4 url: "Catalogo /{ maximo}",
5 defaults: new { controller = "Editora", action = "Index",
6 maximo = UrlParameter.Optional }
7 );
8 ...
Código C# 7.27: RoutesConfig.cs
Os parâmetros das rotas podem ser recuperados nas ações. Observe o exemplo abaixo.
1 ...
2 public ActionResult Index(int? maximo)
3 {
4 // implementação
5 }
6 ...
Código C# 7.28: EditoraController.cs
Ao definir parâmetros opcionais, devemos utilizar parâmetros do tipo nullable type nas ações,
pois quando o parâmetro não estiver definido na url de uma requisição, o valor null será atribuído
ao parâmetro da ação. Por exemplo, para os tipos int e double, devemos utilizar int? e double?,
respectivamente.
Exercícios de Fixação
12 Altere a rota padrão do projeto CamadaDeControle. Para isso, modifique o arquivo RouteCon-
fig.cs da pasta App_Start.
1 ...
2 routes.MapRoute(
3 name: "Default",
www.facebook.com/k19treinamentos 139
CAMADA DE CONTROLE 140
4 url: "{controller }/{ action }/{id}",
5 defaults: new {
6 controller = "Produto",
7 action = "Lista",
8 id = UrlParameter.Optional
9 }
10 );
11 ...
Código C# 7.29: RouteConfig.cs
Teste essa nova configuração acessando a url http://localhost:<PORTA_APP>/.
13 Adicione uma rota no projeto CamadaDeControle. Para isso, modifique o arquivo RouteCon-
fig.cs da pasta App_Start.
1 ...
2 routes.MapRoute(
3 name: "ProdutoListaPorPreco",
4 url: "Produto/Lista/{ PrecoMinimo }/{ PrecoMaximo}",
5 defaults: new { controller = "Produto", action = "Lista" }
6 );
7 ...
Código C# 7.30: RouteConfig.cs
OBS: A rota ProdutoListaPorPreco deve ser adicionada antes da rota Default.
14 Altere a ação Lista do controlador Produto.
1 ...
2 public ActionResult Lista(double? precoMinimo , double? precoMaximo)
3 {
4 K19Context ctx = new K19Context ();
5 var produtos = ctx.Produtos.AsEnumerable ();
6
7 if (precoMinimo != null && precoMaximo != null)
8 {
9 produtos = from p in produtos
10 where p.Preco >= precoMinimo & p.Preco <= precoMaximo
11 select p;
12 }
13
14 return View(produtos);
15 }
16 ...
Código C# 7.31: ProdutoController.cs
Teste a aplicação acessando a url http://localhost:<PORTA_APP>/Produto/Lista/0/200. Al-
tere os valores 0 e 200 para obter listas de produtos diferentes.
15 Adicione duas ações no controlador Produto para implementar a edição de produtos.
1 ...
2 public ActionResult Editar(int id = 0)
3 {
4 K19Context ctx = new K19Context ();
5 Produto p = ctx.Produtos.Find(id);
140 www.k19.com.br
141 CAMADA DE CONTROLE
6
7 if (p == null)
8 {
9 return HttpNotFound ();
10 }
11
12 return View(p);
13 }
14
15 [HttpPost]
16 public ActionResult Editar(Produto p)
17 {
18 K19Context ctx = new K19Context ();
19 ctx.Entry(p).State = System.Data.EntityState.Modified;
20
21 ctx.SaveChanges ();
22
23 return RedirectToAction("Lista");
24 }
25 ...
Código C# 7.32: ProdutoController.cs
16 Modifique a página de listagem de produtos. Para isso, altere o arquivo Lista.cshtml da pasta
Views/Produto.
1 @using CamadaDeControle.Models
2 @model IEnumerable <Produto >
3
4 @{
5 ViewBag.Title = "Lista";
6 }
7
8 <h2 >Lista </h2>
9
10 @if (TempData["Mensagem"] != null)
11 {
12 <div >@TempData["Mensagem"]</div >
13 }
14
15 <table >
16 <tr >
17 <th >@Html.DisplayNameFor(m => m.Nome)</th>
18 <th >@Html.DisplayNameFor(m => m.Descricao)</th>
19 <th >@Html.DisplayNameFor(m => m.Preco)</th>
20 <th ></th>
21 </tr >
22 @foreach(var produto in Model)
23 {
24 <tr >
25 <td >@Html.DisplayFor(m => produto.Nome)</td>
26 <td >@Html.DisplayFor(m => produto.Descricao)</td>
27 <td >@Html.DisplayFor(m => produto.Preco)</td>
28 <td >@Html.ActionLink("Editar", "Editar", new { id = produto.ProdutoID }) </td>
29 </tr >
30 }
31 </table >
Código C# 7.33: Lista.cs
17 Adicione uma página associada à ação Editar do controlador Produto.
1 @model CamadaDeControle.Models.Produto
2
www.facebook.com/k19treinamentos 141
CAMADA DE CONTROLE 142
3 @{
4 ViewBag.Title = "Editar";
5 }
6
7 <h2 >Editar </h2>
8
9 @using (Html.BeginForm ())
10 {
11 @Html.EditorFor(m => m.ProdutoID)
12 <div >@Html.LabelFor(m => m.Nome)</div >
13 @Html.EditorFor(m => m.Nome)
14 <div >@Html.LabelFor(m => m.Descricao)</div >
15 @Html.EditorFor(m => m.Descricao)
16 <div >@Html.LabelFor(m => m.Preco)</div >
17 @Html.EditorFor(m => m.Preco)
18
19 <div ><input type="submit" value="Editar" /></div >
20 }