Criando rotas com Asp.Net MVC parte I

Umas das coisas mais bacanas no Asp.Net MVC são os esquemas de rotas ela mapeia a URI dos request para algum controle e uma ação.

Exemplos de rota padrão no MVC

 

                routes.MapRoute(
                    name: "Default",
                    url: "{controller}/{action}/{id}",
                    defaults: new { controller = "Home", action = "Index",
                    id = UrlParameter.Optional }
                );

Entendendo a execução da rota.

Vamos imaginar que temos um site com as seguintes estruturas de URLS

www.meusite.com.br/Home/

www.meusite.com.br/Produto/Cadastro/

www.meusite.com.br/Usuario/Lista/

Para o Asp.Net MVC  o controle da rota será o segundo índice da hierarquia da url, então no exemplo apresentado os  controles do site será Home,Produto,Usuario e a Action são Index,Cadastro,Lista.

Note que na url www.meusite.com.br/Home/ não tem uma action definida na url, quando não existir um controle seguido por uma ação à rota automaticamente chama a ação index por causa do parâmetro defaults, abaixo uma imagem ilustrativa.

 

Outra coisa interessante e quando entramos no site www.meuseite.com.br não passamos nenhum controle a própria rota identifica e executa a rota padrão

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

Muitas vezes precisamos que as rotas sejam executas e apresentadas não no formato de url amigáveis e sim no padrão informado abaixo.

www.meusite.com.br/Home.html,

www.meusite.com.br/Produtos/Lista.html

Para que esse tipo de rota possa acontecer precisamos criar a seguinte regra.

   
          routes.MapRoute(
                name: "RotaControleHTML",
                url: "{controller}.html",
                defaults: new { controller = "Home", action = "Index",
                id = UrlParameter.Optional }
            );
            routes.MapRoute(
                name: "RotaControleActionHTML",
                url: "{controller}/{action}.html",
                defaults: new { controller = "Home", action = "Index", 
                id = UrlParameter.Optional }
           );
            routes.MapRoute(
                    name: "Default",
                    url: "{controller}/{action}/{id}",
                    defaults: new { controller = "Home", action = "Index", 
                    id = UrlParameter.Optional }
                );

No exemplo acima utilizamos a extensão .html, porém podemos utilizar qualquer tipo de extensão como .php,.asp,.aspx.

Quando trabalhamos em aplicações web quase sempre temos uma área administrativa e uma área pública.

E muitas vezes utilizamos controles e ações como o mesmo nome, como na ilustração abaixo.

 

 

 
 
Quando não especificamos qual o namespaces da rota, acontecerá uma colisão de rotas.

“Multiple types were found that match the controller named”

Para resolver esse problema precisamos acrescentar o namespaces em cada lugar que tenha uma rota, confira abaixo uma solução para esse problema.

                context.MapRoute(
                name: "Admin_default",
                url: "Admin/{controller}/{action}/{id}",
               defaults: new { action = "Index", id = UrlParameter.Optional },
               namespaces: new[] { "ProjetoMVCRotas.Admin.Controllers" }
            );

Nesse artigo aprendemos!

  1. O que são  rotas
  2. Como criar e customizar rotas
  3. Evitar colisões entre rotas

No próximo artigo vamos aprender a trabalhar com parâmetros.

3 Responses so far.

  1. Silas disse:
    Parabéns pelo artigo. Gostaria de saber como faço pra configurar a rota de uma forma que os meus arquivos de controllers e o de configuração da rota esteja em uma class library diferente das Views, como configuro? Obrigado.
  2. Juliano Sales disse:
    Boa Tarde Silas,
    Obrigado pelo seu comentário, o que você pode fazer e herdar da class RouteCollection, acredito que ira funcionar, exemplo abaixo :

    public class RouteConfig
    {
    public static void RegisterRoutes(RouteCollection routes)
    {
    routes.IgnoreRoute(“{resource}.axd/{*pathInfo}”);

    routes.MapRoute(
    name: “Default”,
    url: “{controller}/{action}/{id}”,
    defaults: new { controller = “Home”, action = “Index”, id = UrlParameter.Optional }
    );

    routes = new T();
    }

    }
    public class T : RouteCollection
    {

    }

  3. Juliano, teu artigo acima foi de grande ajuda para mim. Estou otimizando o site da empresa e precisava colocar o caminho todo. Mas encontrei um problema. No Index da página de notícias eu faço a chamada por uma requisição ajax de um método no Controller daquela página. Já viu isto? Pode me ajudar?

LEAVE A COMMENT