Desenvolvimento - ASP. NET

Trabalhando com Rotas no ASP.NET MVC

O ASP.NET MVC utiliza o ASP.NET Routing para rotear URLs, tornando o acesso e requisições via URL mais amigáveis. O recurso ASP.NET Routing não é exclusivo do ASP.NET MVC, mas se tornou um recurso indispensável, já que o mesmo é utilizado para endereçar as requisições para as ações dos Controllers.

por André Baltieri



Introdução

O ASP.NET MVC utiliza o ASP.NET Routing para rotear URLs, tornando o acesso e requisições via URL mais amigáveis. O recurso ASP.NET Routing não é exclusivo do ASP.NET MVC, mas se tornou um recurso indispensável, já que o mesmo é utilizado para endereçar as requisições para as ações dos Controllers.

Entendendo o ASP.NET Routing

As aplicações ASP.NET MVC já vem configuradas para utilizar o ASP.NET Routing, e estas configurações estão armazenadas no arquivo Web.Config.

Basicamente, temos quatro sessões relevantes no arquivo Web.Config quando falamos de rotas. São elas:

· system.web.httpModules

· system.web.httpHandlers

· system.webserver.modules

· system.webserver.handlers

Durante a execussão da aplicação, uma tabela de rotas (Route Table) é criada durante o evento Application_Start() no arquivo Global.asax (Arquivo que gerencia o ciclo de vida das aplicações ASP.NET).

Resumindo:

· Uma requisição do browser é mapeada para uma ação do controller através de uma funcionalidade do ASP.NET chamada de ASP.NET Routing.

· O ASP.NET Routing é utilizado pelo ASP.NET MVC framework para rotear requisições para as ações do controller.

· O ASP.NET Routing utiliza o Route Table para manipular as requisições que chegam. Esta tabela de rotas é criada quando a aplicação roda pela primeira vez. Esta tabela é configurada no arquivo Global.asax.

Nota: A URL não significa que estamos endereçando uma página.

Como mostrado na Listagem 1, o arquivo Global.asax contém as rotas (Neste caso possúi somente a rota padrão [DEFAULT]) e o método Application_Start() invoca o método RegisterRoutes() que contém as rotas.

   1:  public class MvcApplication : System.Web.HttpApplication

   2:      {

   3:          public static void RegisterRoutes(RouteCollection routes)

   4:          {

   5:              routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

   6: 

   7:              routes.MapRoute(

   8:                  "Default", // Route name

   9:                  "{controller}/{action}/{id}", // URL with parameters

  10:                  new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults

  11:              );

  12: 

  13:          }

  14: 

  15:          protected void Application_Start()

  16:          {

  17:              AreaRegistration.RegisterAllAreas();

  18: 

  19:              RegisterRoutes(RouteTable.Routes);

  20:          }

  21:      }

Listagem 1 – Arquivo Global.asax

Quando a aplicação roda pela primeira vez, o método Application_Start() é chamado. Então este chama o método RegisterRoutes() que criar a tabela de rotas padrão.

A tabela de rotas padrão consiste em uma rota. Esta rota padrão quebra todas as requisições em 3 segmentos.

O primeiro segmento mapeia o nome do controller, o segundo mapeia o nome da ação e o terceiro mapeia um parâmetro passado para ação chamado Id.

Exemplo de URL http://localhost/Product/Detail/3

· Controller = Product

· Action = Details

· Id = 3

Rotas Customizadas (Custom Routes)

Para muitas aplicações ASP.NET MVC a tabela de rotas padrão funcionará bem, entretanto, poderá haver necessidade da criação de rotas customizadas.

Imagine, por exemplo, a construção de um blog onde pode se fazer necessário a manipulação de requisições como esta:
/Archive/02-09-2010.

Quando um usuário faz esta requisição, isto corresponde a uma data, mas para manipular esta requisição será necessário criar uma rota customizada.

A Listagem 2 mostra a criação de uma nova Rota no arquivo Global.asax. Esta rota é customizada para listar entradas do blog cuja data seja igual a data especificada pelo parâmetro entryDate.

   1:  routes.MapRoute(

   2:                 "Blog", // Route name

   3:                 "{Archive}/{entryDate}", // URL with parameters

   4:                 new { controller = "Archive", action = "Archive", entryDate = DateTime.Now } // Parameter defaults

   5:             );

Listagem 2 – Rota customizadas para rotear entradas de um blog pela data do post.

A ordem de adição das rotas na Route Table é importante. Adcionamos a rota antes da rota Default (Padrão). Se esta ordem for invertida, a rota padrão sempre será chamada, ao invés da rota customizada.

A rota customizada assume qualquer requisição que comece com /Archive/. Exemplo:

· /Archive/10-28-1985

· /Archive/10-6-2010

· /Archive/learnmvc

O mapeamento da rota customizada mapeia a requisição para o controller Archive (Listagem 3) e invoca a ação Entry().

Quando a ação Entry() é chamada, a data é passada como parâmetro (entryDate).

   1:  using System;

   2:  using System.Web.Mvc;

   3: 

   4:  namespace Video3.Controllers

   5:  {

   6:      public class ArchiveController : Controller

   7:      {

   8:          //

   9:          // GET: /Archive/

  10: 

  11:          public string Archive(DateTime entryDate)

  12:          {

  13:              return entryDate.ToString("dd/MM/yyyy");

  14:          }

  15: 

  16:      }

  17:  }

Listagem 3 – Controller Archive

Conclusão

A rota padrão do ASP.NET MVC atende boa parte das nossas necessidades, mas não todas. A criação de rotas customizadas permite maior flexibilidade e amigabilidade das URLs, tornando a aplicação mais acessível.

Entendemos também como funciona o ASP.NET Routing, que é um componente fundamental quando falamos sobre roteamento de URLs.

Referências

ASP.NET MVC
http://www.asp.net/mvc

Até o próximo artigo!

André Baltieri

André Baltieri - Trabalha com desenvolvimento de aplicações web a mais de 7 anos, e com ASP.NET desde 2003. É líder da comunidade Inside .NET (http://www.insidedotnet.com.br/) e do projeto Learn MVC .NET (http://learn-mvc.net/). Bacharelando em Sistemas de Informação, atualmente trabalha com desenvolvimento e suporte de aplicações web em ASP.NET/C# em projetos internacionais e ministra treinamentos e consultorias sobre a plataforma .NET.