ASP.NET MVC Routing - различия между веб-сайтом и виртуальным каталогом - PullRequest
0 голосов
/ 07 марта 2012

У меня есть приложение ASP.NET MVC 3 (в IIS 7.5) с переносимой областью. Когда я размещаю приложение, занимающее переносимую область на веб-сайте, моя маршрутизация работает отлично, например

http://localhost:9001/Clearance/Home/Search (это работает)

Однако при размещении в виртуальном каталоге, например,

http://localhost/Acme.Risks.Clearance.Web.Area.TestUI/Clearance/Home/Search (это не работает)

Я получаю следующую ошибку:

Обнаружено несколько типов, соответствующих контроллеру с именем «Home». Это может произойти, если маршрут, который обслуживает этот запрос ('Clearance / {controller} / {action}'), не указывает пространства имен для поиска контроллера, соответствующего запросу. В этом случае зарегистрируйте этот маршрут, вызвав перегрузку метода MapRoute, который принимает параметр namespaces.

Я не понимаю, почему, я указываю пространства имен, которые отлично работают при работе на веб-сайте.

Вот моя портативная зона регистрации:

    public override void RegisterArea(AreaRegistrationContext context, IApplicationBus bus)
    {
        if (context == null)
        {
            throw new ArgumentNullException("context");
        }

        base.RegisterArea(context, bus);
        context.MapRoute(
            RouteName.ClearanceAreaDefault, 
            this.AreaName + "/{controller}/{action}/{id}", 
            new { controller = "Home", action = "Search", id = UrlParameter.Optional },
            new[] { typeof(HomeController).Namespace });
    }

Вот Global.asax для веб-приложения в виртуальном каталоге (не работает):

    public static void RegisterRoutes(RouteCollection routes)
    {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
        routes.MapRoute(
            "Default",
            "{controller}/{action}/{id}",
            new { controller = "Home", action = "Index", id = UrlParameter.Optional },
            new[] { typeof(HomeController).Namespace });
    }

Вот Global.asax для веб-приложения на веб-сайте (работает):

    public static void RegisterRoutes(RouteCollection routes)
    {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
        routes.MapRoute(
            "Default",
            "{controller}/{action}/{id}",
            new { controller = "Home", action = "Index", id = UrlParameter.Optional },
            new[] { "Acme.Risks.Web.UI.Controllers" });
    }

Я использовал "RouteDebugger" Фила Хаака (http://nuget.org/packages/routedebugger), и информация об отладке маршрута по обоим запросам идентична.

Кто-нибудь знает, почему это происходит?

Спасибо

Каллум

1 Ответ

0 голосов
/ 20 марта 2012

Это было до пространства имен, используемого в контексте данных для MVC.

Моя сборка веб-области - "Acme.Risks.Clearance.Web.Area".

Сборка моего веб-сайта«Acme.Risks.Web.UI» (работает).

Моя сборка пользовательского интерфейса для тестирования веб-области - «Acme.Risks.Clearance.Web.Area.TestUI» (не работает).

Пространство имен, используемое в контексте данных, было «Acme.Risks.Clearance.Web.Area *», поэтому в случае пользовательского интерфейса тестирования веб-области подстановочный знак вызвал два совпадения.Таким образом, даже несмотря на то, что информация о маршрутизации была идентична, ASP.NET MVC не мог решить, какая сборка была правильной, поскольку имелись повторяющиеся совпадения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...