Неоднозначные имена контроллеров в ASP.NET MVC

Я попытался внедрить демо Phil's Areas в мой проект http://haacked.com/archive/2008/11/04/areas-in-aspnetmvc.aspx . Я добавил структуру Areas / Blog в свой существующий проект MVC, и я получил следующую ошибку в своем проекте.

Имя контроллера «Home» неоднозначно для следующих типов: WebMVC.Controllers.HomeController WebMVC.Areas.Blogs.Controllers.HomeController

Вот так выглядит мой global.asax.

public static void RegisterRoutes (RouteCollection маршруты) {rout.IgnoreRoute ("{ресурс} .axd / {* pathInfo}");

        routes.MapAreas("{controller}/{action}/{id}",
            "WebMVC.Areas.Blogs",
            new[] { "Blogs", "Forums" });

        routes.MapRootArea("{controller}/{action}/{id}",
            "WebMVC",
            new { controller = "Home", action = "Index", id = "" });

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

    }

    protected void Application_Start()
    {
        String assemblyName = Assembly.GetExecutingAssembly().CodeBase;
        String path = new Uri(assemblyName).LocalPath;
        Directory.SetCurrentDirectory(Path.GetDirectoryName(path));
        ViewEngines.Engines.Clear();
        ViewEngines.Engines.Add(new AreaViewEngine());
                  RegisterRoutes(RouteTable.Routes);
       // RouteDebug.RouteDebugger.RewriteRoutesForTesting(RouteTable.Routes);

    }

Если я удаляю / Areas / Blogs из router.MapAreas, он смотрит на Индекс корня.

16.01.2009 20:20:00
3 ОТВЕТА

Вместо WebMVC.Areas.Blogs и WebMVC используйте WebMVC.Areas.Blogs и WebMVC.Areas.OtherAreaName. Думайте о названии области как о корне пространства имен, а не как об абсолютном пространстве имен.

1
16.01.2009 22:03:51
Я не уверен, что мне нравится это решение. При проектировании проектов главная папка контроллеров / представлений явно является их собственной «областью», им просто не присваивается имя. Я бы хотел, чтобы это продолжало функционировать как есть.
midas06 6.12.2009 07:20:24
Вы можете сделать это, если вы настроите свой маршрут, чтобы использовать «основной» в качестве области по умолчанию.
Craig Stuntz 7.12.2009 21:34:27

В ASP.NET MVC 2.0 вы можете включать пространство имен для ваших родительских контроллеров проекта при регистрации маршрутов в родительской области.

routes.MapRoute(
    "Default",                                             
    "{controller}/{action}/{id}",                          
    new { controller = "Home", action = "Index", id = "" },
    new string[] { "MyProjectName.Controllers" }
);

Это ограничивает маршрут поиском контроллеров только в указанном вами пространстве имен.

3
8.02.2010 20:13:29

Вы можете расставить приоритеты между несколькими контроллерами с одинаковым именем в маршрутизации следующим образом

Например, у меня есть один контроллер с именем HomeController внутри, Areas/Admin/HomeController а другой - в корне, /controller/HomeController
поэтому я назначаю свой корневой приоритет следующим образом:

routes.MapRoute(
    "Default", // Route name
    "{controller}/{action}/{id}", // URL with parameters
    new { controller = "Home", action = "Index", // Parameter defaults
    id = UrlParameter.Optional },
    new [] { "MyAppName.Controllers" } // Prioritized namespace which tells the current asp.net mvc pipeline to route for root controller not in areas.
);
0
16.03.2016 21:29:52