MVC 3路由和操作链接不遵循预期的上下文路由

我正在尝试做一个自定义路由,所以我可以在我的应用程序中使用选定的字符串作为前缀,并根据它进行一些处理。 我遇到的问题是,生成的操作链接不是基于它所存在的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生成的链接不服从它们被加载的上下文,至少对于{controller} / { action} / {id}默认路由。 在TEST / Space / Index列表下加载的页面链接正确,但是当加载/ Space / Index时,它们都引用了调用URL所没有的TEST /路由。 这是默认行为吗? 有没有办法让这些链接在适当的上下文中生成?

编辑:

我看到的第一个地方是没有TEST的Html.BeginForm /

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

它将链接呈现为TEST / Space / ToTheMoon

但它也出现在链接中:

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

它呈现TEST / Space / SpacePort

我找到了一些方法,以便不会丢失上下文。 以下是我为实现这一目标所做的工作。

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路径。

我发现的一些信息都在这个页面上 。

如果你这样做:

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

这将与您的集合中的第一条路线(TestRoute)相匹配。 这是默认行为。

如果要选择特定路线,请改用@Html.RouteLink

如果要定位特定路径,可以使用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"})