我现在遇到一个奇怪的问题,我正在处理一个只有一条路线的项目:
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将保持我孤立了。
有什么想法吗?
答案 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).))*$" }
我仍然有点困惑,因为路由应该是匹配网址的规则,而不是强制执行它们的规则。无论如何,这让我再次前进。