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"})
- GetOriginalTypeParameterType throws未将对象引用设置为对象exception的实例
- 如何获取模型属性的id以与MVC3中的自定义IClientValidatable一起使用
- 可以在ASP.NET / IIS 7中有选择地禁用gzip压缩吗?
- asp.net mvc 3 handleerror全局filter始终显示IIS状态500页面
- 如何在MVC 3中的Request.Form集合中访问未经validation的项目
- 当用户未在asp.net mvc3中授权时,重定向到另一个页面
- 如何在MVC3应用程序中构建HTML消息以进行发送?
- 从MVC 3中的ActionResult类型方法返回一个JSon数组到$ .ajax
- 如何在重定向,asp.net mvc3之前确保控制器和操作存在