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:
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
Higor Ramos