Область ASP.Net MVC 2, Подрайон и Маршруты - PullRequest
2 голосов
/ 19 июля 2010

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

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

Мои регистрации маршрутов в том порядке, в котором они зарегистрированы, считают, что регистрации 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 Ответ

2 голосов
/ 24 февраля 2012

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

На самом деле вы можете заставить инфраструктуру MVC направлять ваш запрос так, как вам нравится в соответствии с вашими требованиями.

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

См. этот ответ до asp.net mvc сложная маршрутизация для дерева в качестве примера для начала работы.

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

routes.MapRoute(
    "Tree",
    "Tree/{*path}",
    new { controller = "Tree", action = "Index" })
            .RouteHandler = new TreeRouteHandler();
...