Olá pessoal, tudo bem ? eu estou tendo a oportunidade de ministrar alguns treinamentos pela Lambda3 e um desses treinamentos é o de ASP.NET MVC. Eu uso “MVC” desde o beta 1 e gosto bastante do framework, quem quiser saber um pouco mais sobre os treinamentos da lambda3 pode olhar aqui, inclusive teremos turmas no Rio de Janeiro.

Falando sobre o que importa, eu estou lendo o livro Pro ASP.NET MVC4 e vou falar sobre algumas coisas legais que não vejo pessoas falando normalmente sobre as capacidades do framework, e uma das features pouco exploradas são as rotas, então vamos ver um pouco mais sobre elas.

Priorizando controllers por namespace
Quando o mvc recebe uma requisição o sistema de roteamento analisa a rota e identifica quem deve responder a requisição, ou seja quando realizamos uma requisição para a url:

http://localhost:61049/Home/Index

O sistema de roteamento procura por um controller de nome HomeController de forma desqualificada, ou seja, independente do namespace. O framework não sabe o que fazer quando por exemplo existe um controller com o mesmo nome em outra pasta. por exemplo, se criarmos um HomeController dentro de uma pasta additional teremos o seguinte erro:

ErroMVCMultipleControllers

Para resolver esse problema podemos priorizar controllers usando o namespace. Então se quisermos que o controller dentro da pasta additional seja priorizado basta configurar o namespace no roteamento, segue o exemplo:

routes.MapRoute(
  name: "Default",
  url: "{controller}/{action}/{id}",
  defaults: new { controller = "Home", action = "Index",
  id = UrlPa  rameter.Optional },
  namespaces: new[]
  {"ASPNETMVC4.Exemplos.RotasPorNamespace.Controllers.Additional",}
);

Com o código acima o framework vai priorizar o namespace configurado e caso não encontre o controller no namespace então qualquer controller, independente de namespace será utilizado.
O último detalhe é tomar cuidado para não priorizar mais de um namespace com um controller do mesmo nome, se mais de um namespace estiver configurado o erro acontece novamente, exemplo:

routes.MapRoute(
  name: "Default",
  url: "{controller}/{action}/{id}",
  defaults: new { controller = "Home", action = "Index",
  id = UrlParameter.Optional },
  namespaces: new[]{
    "ASPNETMVC4.Exemplos.RotasPorNamespace.Controllers.Additional",
    "ASPNETMVC4.Exemplos.RotasPorNamespace.Controllers"
    }
);

É isso pessoal, o código de exemplo está no GitHub.

Esse artigo foi postado também em higorcesar.com.br