Erro com múltiplos controllers de mesmo nome no ASP.Net MVC

No ASP.Net MVC (ao menos na versão 3), quando se possui vários controllers de mesmo nome (ex: HomeController) ainda que em namespaces diferentes, como é o caso de quando se usa o recurso Areas para organização da aplicação, é gerada a seguinte exceção:

Multiple types were found that match the controller named ‘Home’. This can happen if the route that services this request (‘{controller}/{action}/{id}’) does not specify namespaces to search for a controller that matches the request. If this is the case, register this route by calling an overload of the ‘MapRoute’ method that takes a ‘namespaces’ parameter.

A solução para este erro é bem simples, mas primeiro vamos ao porquê do erro.

O método de registro de rotas do Global.asax.cs é criado automaticamente da seguinte forma:


public static void RegisterRoutes(RouteCollection routes)
        {
            routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

            routes.MapRoute(
                "Default", // Route name
                "{controller}/{action}/{id}", // URL with parameters
                new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults
            );
        }

Como podem observar, nesta chamada de método não há qualquer informação sobre qual namespace utilizar, então como havia dito anteriormente que a correção é simples…
Inclua um parâmetro do tipo String[] no método MapRoute indicando quais namespaces utilizarão esta rota que acaba de ser informada.


public static void RegisterRoutes(RouteCollection routes)
        {
            routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

            routes.MapRoute(
                "Default", // Route name
                "{controller}/{action}/{id}", // URL with parameters
                new { controller = "Home", action = "Index", id = UrlParameter.Optional }, // Parameter defaults
                new String[] { "MyNamespace.MyControllers" }
            );
        }

Pronto. Código corrigido!

Be Sociable, Share!

1 Comment

Deixe uma resposta