Область ASP.Net MVC 2, Подрайон и Маршруты

Я искал решение для моей проблемы. Нашел много похожих проблем, но ни одна из них не привела к решению для меня.

Я пытаюсь зарегистрировать область в пределах области. Это работает, однако это "частично" портит мою маршрутизацию.

Мои регистрации маршрутов в том порядке, в котором они зарегистрированы, считают, что регистрации FooBar и Foo поступают от AreaRegistrations

 routes.MapRoute("FooBar_default",
           "Foo/Bar/{controller}/{action}",
           new { area = "Foo/Bar", controller = "Home", action = "Index"},
           new[] { BarHomeControllerType.Namespace }
  );

  routes.MapRoute("Foo_default",
            "Foo/{controller}/{action}/{id}",
            new { area = "Foo", controller = "Start", action = "Index", id = UrlParameter.Optional },
            new { controller = new NotSubArea()},
            new[] { typeof(StartController).Namespace }
        );

   routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

   routes.MapRoute("PagesRoute", "Pages/{action}", new { controller = "Pages", Action "Index" }).DataTokens["UseNamespaceFallback"] = false;

   routes.MapRoute("Default", // Route name
            "{controller}/{action}/{id}", 
            new { controller = "Home", action = "Index", id = UrlParameter.Optional },
            new[] { typeof(HomeController).Namespace }
            ).DataTokens["UseNamespaceFallback"] = false;

Теперь возникает следующая проблема. При переходе на Веб-сайт / Foo / или Веб-сайт / Foo/Bar ссылки на этих страницах создаются правильно с использованием:

  !{Html.ActionLink<HomeController>(c => c.Index(),"Home", new { area = "Foo/Bar"})}
  or
  !{ Url.Action("Index", "Home", new { area = "Foo/Bar"}) } //or a different area

Однако, когда я использую это на своих главных страницах, другими словами, Сайт / или Сайт / Дом и т. Д.

  !{Html.ActionLink<HomeController>(c => c.Index(),"Home", new { area = ""})}
  or
  !{ Url.Action("Index", "Home", new { area = ""}) } 
  //or with no area identifier specified

Он генерирует URL: Веб-сайт / Foo/Bar / Home и т. Д... Какой путь не так.

Когда я удаляю регистрацию области для Foo/Bar, все снова работает. Переход к URL-адресам "Сайт / Дом / О компании" или "Сайт / Дом" напрямую отображает правильные страницы, поэтому я предполагаю, что внутренний UrlHelper каким-то образом выбирает неправильные маршруты для рендеринга.

Я попытался изменить порядок маршрутов FooBar_default и Foo_Default, чтобы маршрут Foo_default регистрировался до маршрута FooBar_default, но затем область больше не работает (ресурс не найден) и ссылки по-прежнему генерируются неправильно.

Самое странное, что удаление регистрации Foo/Bar решает эту проблему. Я надеялся, что кто-нибудь сможет пролить свет на этот вопрос.

1 ответ

Что вам нужно понять, что Area - это просто концепция маршрутизации, которую Microsoft аккуратно завернула в концепцию или UrlRouting, чтобы люди начали.

Вы можете получить MVC-фреймворк для маршрутизации вашего запроса в соответствии с вашими требованиями.

Что вам может понадобиться, это написать свой собственный RouteHandler. Это позволит вам правильно указать, как инфраструктура MVC направляет любой запрос в соответствии с вашими требованиями.

Посмотрите этот ответ на сложную маршрутизацию asp.net MVC для дерева пути в качестве примера, чтобы начать работу.

chris166 говорится, что моя реализация вашего собственного IRouteHandler и сопоставление вашего маршрута для его использования должны дать вам то, что вам нужно. Это немного больше усилий, чем использование коробочного решения областей, но должно дать вам лучшие результаты.

routes.MapRoute(
    "Tree",
    "Tree/{*path}",
    new { controller = "Tree", action = "Index" })
            .RouteHandler = new TreeRouteHandler();
Другие вопросы по тегам