没有前缀路由的MVC特定路由

时间:2014-12-01 09:30:15

标签: asp.net-mvc asp.net-mvc-4 routing

我现在遇到一个奇怪的问题,我正在处理一个只有一条路线的项目:

routes.MapRoute( name: "Default", url: "{controller}/{action}/{id}" defaults: new { controller: "SomeController", action: "SomeAction" } );

现在他们无法更改此默认路由,因为一切正常但是现在我遇到了一个问题,即我正在研究现有功能的原型,他们拒绝在单独的分支中执行此操作我被困在主线上。忽略所有这些约束我想把我们的新工作分离到它自己的url中,因为我想开始尝试在路由和响应类型中保持安静,所以这就是我在疯狂中创建一个理智的堡垒。

现在要隔离我们的东西,我添加了以下路线:

routes.MapRoute( name: "SanityRoute", url: "my-module/{controller}/{action}/{id}" defaults: new { controller: "Dashboard", action: "Index" }, namespaces: new [] { Namespace.To.My.Isolated.Controllers } );

所以我的所有新内容都在/my-module前缀的网址中,但是这并不是因为我把它放在Default路线之后,这意味着默认仍然会抓住它(我把路线调试器打开来证明这一点),所以我认为我会将我的路线置于默认路线之上以使其更具体,在所有其他路线之后会是这样的:

http://some-url/SomeController/SomeAction

http://some-url/my-module/SomeController/SomeAction

这似乎很有效,我想,然而我注意到所有其他路线都以my-module为前缀,这似乎很奇怪。所以我会去登录/(root url),这很好,然后重定向的登录会把我带到my-module/SomeControllerNotInMyModule/SomeAction所以它在我的模块范围之外呈现了正确的控制器,但它保留了前缀路线所以其他人都有点困惑。

所以我有点疑惑为什么MVC在所有路由前加my-module,因为它只在路由url中指定,我会假设在我的模块之外的控制器路由上的这个前缀的LACK将保持我孤立了。

有什么想法吗?

3 个答案:

答案 0 :(得分:0)

根据我的理解,我认为你正在使用Area来创建我的模块。 如果没有显示请参阅“使用区域组织ASP.NET MVC应用程序” 可能会因为配置错误而发生这种情况。

http://msdn.microsoft.com/en-us/library/ee671793(v=vs.100).aspx

希望这能解决您的问题。

答案 1 :(得分:0)

根据您的代码,我的工作非常完美,因为您在Config文件中添加了两个路径。


routes.MapRoute(     名称:“默认”,     url:“{controller} / {action} / {id}”     默认值:new {controller:“SomeController”,action:“SomeAction”} );

routes.MapRoute(     名称:“SanityRoute”,     url:“my-module / {controller} / {action} / {id}”     默认值:new {controller:“Dashboard”,action:“Index”},     名称空间:new [] {Namespace.To.My.Isolated.Controllers} );

错误:两者都表现得像默认网址。所以,当你正在努力的时候 http://www.website.com/mymodule/SomeController/SomeAction 并尝试重定向到其他URL路由将允许该URL,因为您将其设置为默认值。

尝试以下代码将起作用..

routes.MapRoute(     名称:“默认”,     url:“{controller} / {action}”,     默认值:new {controller =“Home”,action =“Index”} );

routes.MapRoute(     名称:“DashboardRoute”,     url:“myModule / Dashboard / {action}”,     默认值:new {action =“Index”} );

谢谢

答案 2 :(得分:0)

我有点犹豫要把它归类为" THE"回答,但这是让我开始运行的答案,问题似乎源于上述路由配置,基于ActionLink的呼叫似乎在my-module前缀到所有内容,我仍然不知道为什么,似乎要么MVC试图聪明并强制路线匹配第一条路线的前缀(这似乎很奇怪)或这个项目某处有一些自定义URL重写魔术(我在任何地方都找不到,我不喜欢不知道如何影响页面上ActionLink的调用。)

无论如何要解决这个问题,我已将默认路线作为最高得分返回顶部,并对控制器施加约束!=' my-module'。看起来像:

constraints: new { controller: "^((?!my-module).))*$" }

我仍然有点困惑,因为路由应该是匹配网址的规则,而不是强制执行它们的规则。无论如何,这让我再次前进。