Array
(
)

Ambiguous Controllers - Só acontece uma vez

Vegetalzis
   - 02 jul 2009

Galera, minha aplicação tem dois controles principais. A primeira vez q eu clico em links relacionados ao 1º controller, eu tenho o seguinte erro:

The controller name ´Home´ is ambiguous between the following types:
EsgRepublic.Payport.Mvc.Areas.Admin.Controllers.HomeController
EsgRepublic.Payport.Mvc.Controllers.HomeController

Aí se eu clicar de novo em qualquer um dos links ele já funciona 100¬
O engraçado é que isto só ocorre uma vez a cada limpeza & compilação (se eu só recompilar ele nao da erro). E também, se eu clicar em algum dos links do segundo controller, eu posso clicar nos do primeiro sem dar erro.

Meu Global.asax:

#Código

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


            routes.MapLowerCaseAreasEmployees("{controller}/{action}/{id}",
              "EsgRepublic.Payport.Mvc",
              new[] { "Employees" });

            routes.MapLowerCaseAreasDefaultEmployees("{action}/{id}", "EsgRepublic.Payport.Mvc", new[] { "Employees" });



            routes.MapLowerCaseAreas("{controller}/{action}/{id}",
               "EsgRepublic.Payport.Mvc",
               new[] { "Admin" });
           

            routes.MapLowerCaseRootArea("{controller}/{action}/{id}",
                "EsgRepublic.Payport.Mvc",
                new { controller = "Home", action = "Index", id = "" });
        }


Os métodos Map...:

#Código
public static void MapLowerCaseAreas(this RouteCollection routes, string url, string rootNamespace, string[] areas)
        {
            routes.MapLowerCaseAreas(url, rootNamespace, areas, 
                new RouteValueDictionary(new { action = "Index", controller = "Home", id = "" }));
        }

        public static void MapLowerCaseAreas(this RouteCollection routes, string url, string rootNamespace, string[] areas, RouteValueDictionary defaults)
        {
            Array.ForEach(areas, area =>
            {
                Route route = new LowercaseRoute("{area}/" + url, new MvcRouteHandler())
                {
                    Constraints = new RouteValueDictionary(new { area }),
                    Defaults = defaults
                };
                string areaNamespace = rootNamespace + ".Areas." + area + ".Controllers";
                
                route.DataTokens = new RouteValueDictionary(new { namespaces = new string[] { areaNamespace } });

                routes.Add(route);
            });

        }




      


        public static void MapLowerCaseAreasEmployees(this RouteCollection routes, string url, string rootNamespace, string[] areas)
        {
            Array.ForEach(areas, area =>
            {
                Route route = new LowercaseRoute("{area}/" + url, new MvcRouteHandler())
                {
                    Constraints = new RouteValueDictionary(new { area, controller="BankAccount|Home|W4Tax|I9Tax"}),
                    Defaults = new RouteValueDictionary(new {action = "Index", id = "" })
                };
                string areaNamespace = rootNamespace + ".Areas." + area + ".Controllers";
                
                route.DataTokens = new RouteValueDictionary(new { namespaces =  areaNamespace  });

                routes.Add(route);

               
            });


            

            
        }

        public static void MapLowerCaseAreasDefaultEmployees(this RouteCollection routes, string url, string rootNamespace, string[] areas)
        {
            Array.ForEach(areas, area =>
            {
                Route route = new LowercaseRoute("{area}/" + url, new MvcRouteHandler())
                {
                    Constraints = new RouteValueDictionary(new { area}),
                    Defaults = new RouteValueDictionary(new { controller = "Employee",action = "Index", id = "" })
                };
                string areaNamespace = rootNamespace + ".Areas." + area + ".Controllers";

                route.DataTokens = new RouteValueDictionary(new { namespaces = areaNamespace });

                routes.Add(route);


            });





        }


        public static void MapLowerCaseRootArea(this RouteCollection routes, string url, string rootNamespace, object defaults)
        {
            Route route = new LowercaseRoute(url, new MvcRouteHandler())
            {
                Constraints = new RouteValueDictionary(new {controller="Home|", area="root|"}),
                Defaults = new RouteValueDictionary(new { area = "root", action = "Index", controller = "Home", id = "" })
            };
            route.DataTokens = new RouteValueDictionary(new { namespaces = new string[] { rootNamespace + ".Controllers" } });
          //  route.Defaults = new RouteValueDictionary(new { area = "root", action = "Index", controller = "Home", id = "" });
            routes.Add(route);
        }


Valeu galera

Vegetalzis
   - 02 jul 2009

Esqueci de informas quem são os controlers em questão.

EsgRepublic.Payport.Mvc.Areas.Employees.EmployeeController

Este é o controller problemático (seus links q dao erro)

EsgRepublic.Payport.Mvc.Areas.Admin.HomeController

Este é o controller que se for acessado permite o acesso do outro sem erros.