MVC 3 Routing and Action Links не следуют ожидаемому контекстуальному маршруту - PullRequest
2 голосов
/ 03 апреля 2012

Я пытаюсь создать собственный маршрут, чтобы я мог добавить в URL префикс URL-адреса к выбранной строке и выполнить некоторую обработку на основе этого. Проблема, с которой я сталкиваюсь, заключается в том, что сгенерированные ссылки на действия не контекстуализируются на основе URL-адреса, по которому они существуют.

Маршруты:

routes.MapRoute(
            "TestRoute",
            "TEST/{controller}/{action}/{id}",
            new { controller = "Space", action = "Index", id = UrlParameter.Optional });

routes.MapRoute(
            "Default",
            "{controller}/{action}/{id}",
            new { controller = "Space", action = "Index", id = UrlParameter.Optional });

Навигация к TEST / Space / Index работает, а также Space / Index, но странная проблема, которую мне нужно исправить, заключается в том, что ссылки, сгенерированные через ActionLink, не подчиняются контексту, в котором они загружены, по крайней мере для {контроллера } / {action} / {id} маршрут по умолчанию. Страницы, которые загружаются по ссылкам списка TEST / Space / Index должным образом, но когда загружается / Space / Index, все они ссылаются на TEST / route, которого не вызывает вызывающий URL. Это поведение по умолчанию? Есть ли способ заставить эти ссылки генерировать в правильном контексте?

Edit:

Первое место, где я увидел это, было в Html.BeginForm без ТЕСТА /

Html.BeginForm("ToTheMoon", "Space", FormMethod.Post)

, который отображает ссылку как TEST / Space / ToTheMoon

но также отображается в ссылках:

@Html.ActionLink("Take Me To The Space Port", "SpacePort", "Space")

, который отображает TEST / Space / SpacePort

Ответы [ 3 ]

4 голосов
/ 04 апреля 2012

Я нашел способ обойти это, чтобы контекст не был потерян.Вот что я сделал, чтобы заставить это работать.

TestRoute изменяется на это:

routes.MapRoute(
    "TestRoute",
    "{path}/{controller}/{action}/{id}",
    new { controller = "Space", action = "Index", id = UrlParameter.Optional },
    new { path = @"TEST" },
    new string[] { "The.Namespace" });

Установка ограничения на путь и удаление его из маршрута делает эту маршрутизацию работающей.Теперь я могу нажать / TEST / Space / Index, и все мои ссылки, сгенерированные из ActionLink, ведут себя как положено.Также по связанной проблеме я закончил тем, что добавил спецификацию пространства имен в маршрут карты, поскольку среда разработки требовала наличия там для правильной маршрутизации вещей к пути TEST.

Часть информации, которую я нашел, была на этой странице .

3 голосов
/ 03 апреля 2012

Если вы делаете:

@Html.ActionLink("Text", "Index", "Space")

Это будет соответствовать первому маршруту в вашей коллекции (TestRoute). Это поведение по умолчанию.

Если вы хотите выбрать конкретный маршрут, тогда используйте @Html.RouteLink.

0 голосов
/ 03 апреля 2012

Если вы хотите указать целевой маршрут, вы можете использовать расширение RouteLink, оно позволяет вам указать, какой именно маршрут следует использовать для создания ссылки.

@Html.RouteLink("with Test", "TestRoute")
@Html.RouteLink("with Test", "TestRoute", new {controller="Space", action="Foo"})
@Html.RouteLink("without Test", "Default", new {controller="Space", action="Foo"})
...