Dichavando: Um pouco sobre Routes do ASP.NET MVC

Mar 21st, 2008 | By Juliano Oliveira | Category: .net, asp.net, dichavando

Aos amigos que não conhecerem o padrão MVC, sugiro um artigo da Wikipedia

Uma das características do padrão MVC em sites é a url mais amigável. Um exemplo na prática:
Um microondas em uma loja online é encontrado pelos sites de busca com uma url semelhante a essa http://www.umlojaqualquer.com.br/housewares_productdetails.asp?Query=ProductPage&ProdTypeId=27&ProdId=1895899
Horrível para os humanos e para os crawlers da vida. Com urls amigáveis o mesmo produto poderia ser encontrado com uma url assim: http://www.umlojaqualquer.com.br/eletrodomesticos/detalhes/189/forno_microondas_22_L_piccolo_NN-ST357_panasonic

Melhorzinho pra se ler não é? Imagine para os crawlers! :)

Routes

A maioria dos blogs hoje (pelo menos aqueles que cuidam dos detalhes) usam essas técnicas, no caso o Programando em .NET utiliza o Mod_Rewtrite do PHP para fazer isso.Esse tipo de url nos sistemas MVC mais atuais são embutidos na própria arquitetura de pastas como você pode observar na imagem acima. E no ASP.NET MVC (não soh no asp.net mvc, no Ruby on Rails também é assim), essas urls amigáveis são facilmente contruidas com a técnica de ROTEAMENTO. Esta consiste em criar rotas que ao ler o que esta sendo requisitado na url e direcionar para o controler correto, e o controller se encarrega do resto.

Essas rotas são configuradas no arquivo Global.asax.cs. Vamos examinar o conteúdo gerado por padrão ao criarmos um novo projeto:


namespace MeuMVC
{
public class Global : System.Web.HttpApplication
{

protected void Application_Start(object sender, EventArgs e)
{
// Note: Change Url= to Url="[controller].mvc/[action]/[id]" to enable
//       automatic support on IIS6

RouteTable.Routes.Add(new Route
{
Url = "[controller]/[action]/[id]",
Defaults = new { action = "Index", id = (string)null },
RouteHandler = typeof(MvcRouteHandler)
});

RouteTable.Routes.Add(new Route
{
Url = "Default.aspx",
Defaults = new { controller = "Home", action = "Index", id = (string)null },
RouteHandler = typeof(MvcRouteHandler)
});

}
}
}

O que temos ai é que, ao iniciar a aplicação (Application_Start), através da classe estática RouteTable contida na namespace System.Web.Mvc será instanciada duas novas rotas da classe Route, usando como propriedades o formato da url a ação padrão e um handler de rotas.

A propriedade “Url” na rota define uma regra a ser usada no conteúdo da url. Aqui você tem uma infinita flexibilidade para criar regras como quiser. Por exemplo uma regra para um blog: “/Blogs/[Username]/Archive/[Year]/[Month]/[Day]/[Title]”

A propriedade “Defaults” define os valores padrão para a rota caso a url não inclua nada. Nas rotas geradas pelo projeto a primeira define como padrão - action = “Index”, id = (string)null - que diz que ao chamar qualquer Controller sob essa regra, o método padrão que será chamado é o “Index”, passando como valor no parametro “Id” o objeto null.

E por último mas não menos importante, a propriedade “RouteHandler”. Esta define a instancia da classe que será usada para processar a requisição da url, essa classe que direciona as requisições para o lugar certo. In the above examples we are indicating that we want to use the System.Web.Mvc.MvcRounteHandler class to process the URLs we have configured. Essa configuração existe pois também é possivel definir rotas para requisições que não sejam no padrão MVC, por exemplo, chamar um WebForm.

Como funciona?

Chamando a url:

  • http://www.meusite.com.br/
    • Esta requisição (/) cai na segunda regra, pois nenhuma como nada é passado na url, o servidor chama por padrão a pagina Default.aspx, e na segunda regra é passado como parametro para o handler chamar o Controller “Home”, método “Index” e o parametro “Id” nulo.
  • http://www.meusite.com.br/home
    • Na requisição (/home) é processada como “chame o controller home”, e como nenhuma ação ele passa para o handler “chame o método Index passando como parametro ‘null’”
  • http://www.meusite.com.br/produtos
    • Esta regra é o mesmo exemplo acima, porém, esta chamando o Controller “Produtos” e o método “Index” e como parametro ‘null’.
  • http://www.meusite.com.br/home/sobre
    • Nesta requisição (/home/sobre) o processo de roteamente irá chamar o Controller “Home” e invocar o método “Sobre” passando a ele como parametro ‘null’ já que nenhum parametro é passado a url.
  • http://www.meusite.com.br/produtos/listar
    • Segue o mesmo exemplo anterior, chamando o Controller “Produtos”, invocando o método “Listar” e como parametro ‘null’.
  • http://www.meusite.com.br/produtos/detalhes/12
    • Neste exemplo estamos requisitando ao Controller “Detalhes” e invocando o método “Listar” e passando como parametros o valor “12″, seguindo uma lógica, “12″ seria o codigo de um produto, o qual estamos pedindo para visualizar os detalhes.

E nosso exemplo de loja virtual lá em cima?

http://www.umlojaqualquer.com.br/eletrodomesticos/detalhes/189/forno_microondas_22_L_piccolo_NN-ST357_panasonic

Pois então, nessa url, estariamos requerendo do servidor o Controller “Eletrodomesticos” onde poderiamos gerar controlers categorizados por “departamento” e cada departamento ter como cor diferente de layout.

Nesta url, estamos invocando o Método “Detalhes” passando a ele como parametro “189″, o código do produto.

E o “forno_microondas_22_L_piccolo_NN-ST357_panasonic” ????

Isso não seria usado, existe apenas para tornar a url mais amigavel e ajudar na indexação do site. :)

Isto é , se chamassemos apenas http://www.umlojaqualquer.com.br/eletrodomesticos/detalhes/189 teriamos o mesmo resultado.

Espero que gostem do post !

[]´s

Referência:
URL Routing with MVC
ASP.NET MVC Framework (Part 2): URL Routing

Tags: , , ,

2 comments
Escrever um comentário »

  1. Fala Juliano,
    legal a idéia de routes do asp.net, não tinha visto como funcionava ainda. Valeu a dica.

    []´s

  2. legal cara, era justamente oq eu estava procurando…
    muito bem explicado…
    parabéns..

Escrever um comentário