Problem z wieloma kontrolerami o tej samej nazwie w moim projekcie

Napotkałem następujący błąd z moim ASP.NET projekt MVC 3:

Znaleziono wiele typów, które pasują kontroler o nazwie "Home". To może się, jeśli trasa, która obsługuje to request ('Home/{action}/{id}') robi nie określa przestrzeni nazw do wyszukiwania kontroler odpowiadający żądaniu. Jeśli tak jest, zarejestruj to trasa przez wywołanie przeciążenia Metoda "MapRoute", która zajmuje parametr 'przestrzenie nazw'.

Wniosek o "Home" znalazł następujące Kontrolery pasujące: MyCompany.MyProject.WebMvc.Kontrolery.HomeController MyCompany.MyProject.WebMvc.Miejsca.Towarzystwo.Kontrolery.HomeController

W domyślnym folderze kontrolera mam Kontroler HomeController o nazwie klasy MyCompany.MyProject.WebMvc.Kontrolery.HomeController.

Moja metoda RegisterRoutes, w moim globalnym.asax, wygląda jak:

    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
        );
    }

Następnie mam obszar o nazwie Company, z Homecontrollerem w domyślnym folder kontrolera dla obszaru z nazwą klasy MyCompany.MyProject.WebMvc.Miejsca.Towarzystwo.Kontrolery.HomeController.

Metoda RegisterArea w pliku Companyaregistration wygląda następująco:

   public override void RegisterArea(AreaRegistrationContext context)
    {
        context.MapRoute(
            "Company_default",
            "Company/{controller}/{action}/{id}",
            new { area = "Company", action = "Index", id = UrlParameter.Optional }
        );
    }

To wszystko prowadzi do błędu, który podkreśliłem na początku tego postu. Walczę z próbami ułożenia rozwiązania z różnych innych postów, z bez powodzenia.

Czy możliwe jest posiadanie Homecontrollera w domyślnym folderze controllerów, a następnie po jednym w każdym obszarze? Jeśli tak, czy muszę wprowadzać (zakładając, że to zrobię) zmiany w moim pliku konfiguracyjnym, aby to działało?

Każda pomoc będzie mile widziana!
Author: Dan Atkinson, 2011-02-23

8 answers

Komunikat o błędzie zawiera zalecane rozwiązanie: "jeśli tak jest, zarejestruj tę trasę, wywołując przeciążenie metody 'MapRoute', która pobiera parametr' przestrzenie nazw'."

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

To sprawi, że http://server / przejdź do akcji indeksu kontrolera Homecontrollera, która jest, jak sądzę, tym, czego chcesz. http://server/company/home przejdzie do akcji indeksu kontrolera HomeController obszaru firmy, zdefiniowanej w rejestracji obszaru.

 157
Author: David Ruttka,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-02-23 15:25:05

To jest asp.net podejście mvc4:

 routes.MapRoute(
            name: "Default",
            url: "{controller}/{action}/{id}",
            defaults: new { controller = "Home", action = "RegisterNow", id = UrlParameter.Optional },
            namespaces: new[] { "YourCompany.Controllers" }
        );
 28
Author: cooloverride,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-03-27 03:53:07

Zmieniłem nazwę przestrzeni nazw, więc tylko delete de folders bin i obj i rebuild , działają ponownie.

 9
Author: Reynaldo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-12-06 13:22:46

inną prawdopodobną przyczynę tego problemu można znaleźć poniżej:

Znaleziono wiele typów, które pasują do kontrolera o nazwie "Home"

 2
Author: T Gupta,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:34:39

Użyj tego

routes.MapRoute(
            "Default",
            "{controller}/{action}/{id}",
            new { controller = "Home", action = "Index", id = UrlParameter.Optional },
            new[] { "ProjectName.Controllers" }
        );
 2
Author: cracker,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-10-24 07:55:10

Użyj tylko nazwy projektu:

Public Class RouteConfig
    Public Shared Sub RegisterRoutes(ByVal routes As RouteCollection)
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}")
        routes.MapRoute( _
            name:="Default", _
            url:="{controller}/{action}/{id}", _
            defaults:=New With {.controller = "Home", .action = "Index", .id = UrlParameter.Optional} _
           , namespaces:={"MvcAreas"})  
    End Sub
 1
Author: glownet,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-10-09 09:05:56

Jeśli używasz RazorGenerator, samo poinformowanie parametru namespaces może nie wystarczyć.

Muszę rozwiązać dodanie wyrażenia oznaczonego poniżej w Global.asax.cs:

    protected void Application_Start()
    {
        AreaRegistration.RegisterAllAreas();
        FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
        RouteConfig.RegisterRoutes(RouteTable.Routes);
        BundleConfig.RegisterBundles(BundleTable.Bundles);
        ControllerBuilder.Current.DefaultNamespaces.Add("MyProject.Controllers"); // This one
    }
 1
Author: Cigano Morrison Mendez,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-08-17 05:04:13

Jak wspomina Chris Moschini, parametr przestrzeni nazw może nie wystarczyć, jeśli masz dwa obszary o tej samej nazwie kontrolera z różnymi przestrzeniami nazw, a domyślna trasa obszaru brak zwróci błąd serwera 500.

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

Najlepiej jest nadpisać domyślną obsługę trasy i dodać tę linię:

RequestContext.RouteData.DataTokens["UseNamespaceFallback"] = false;
 0
Author: XzaR,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-04-10 12:49:50