Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc 不带前缀路由的MVC特定路由_Asp.net Mvc_Asp.net Mvc 4_Routing - Fatal编程技术网

Asp.net mvc 不带前缀路由的MVC特定路由

Asp.net mvc 不带前缀路由的MVC特定路由,asp.net-mvc,asp.net-mvc-4,routing,Asp.net Mvc,Asp.net Mvc 4,Routing,在我正在进行的一个项目中,我遇到了一个奇怪的问题,该项目只有一条路线是默认路线: routes.MapRoute( 名称:“默认”, url:“{controller}/{action}/{id}” 默认值:新建{controller:“SomeController”,action:“SomeAction”} ); 现在他们不能改变这个默认路线,因为一切都正常,但是现在我遇到了一个问题,我正在开发一个现有功能的原型,他们拒绝在单独的分支中进行,所以我只能在主线上工作。忽略所有这些限制,我想将

在我正在进行的一个项目中,我遇到了一个奇怪的问题,该项目只有一条路线是默认路线:


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

现在他们不能改变这个默认路线,因为一切都正常,但是现在我遇到了一个问题,我正在开发一个现有功能的原型,他们拒绝在单独的分支中进行,所以我只能在主线上工作。忽略所有这些限制,我想将我们的新工作隔离到它自己的url中,因为我想开始尝试在路由和响应类型中使用restful,所以这是我在疯狂的人中开辟的一个理智的堡垒

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


routes.MapRoute(
名称:“SanityRoute”,
url:“我的模块/{controller}/{action}/{id}”
默认值:新建{controller:“Dashboard”,操作:“Index”},
名称空间:新[]{Namespace.To.My.Isolated.Controllers}
);

因此,我所有的新内容都在
/my module
前缀url中,但这不起作用,因为我将它放在
默认路径之后,这意味着默认路径仍在捕获它(我将路径调试器放在上面以证明这一点),所以我认为我会将我的路径放在默认路径之上,使其更具体,毕竟,其他所有路线都是这样的:

http://some-url/SomeController/SomeAction

不是

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

我认为这似乎很有效,但随后我注意到所有其他路由都以
my module
作为前缀,这似乎很奇怪。因此,我将转到登录
/
(根url),这很好,然后重定向的登录将带我到
我的模块/somecontrollernotimymodule/SomeAction
,因此它在我的模块范围之外呈现了正确的控制器,但它一直在为路由添加前缀,因此其他人都有点困惑

因此,我有点困惑,为什么MVC会在所有路由前面加上
my module
,因为它只在路由url中指定,我会假设在我的模块之外的控制器路由上缺少这个前缀会使我保持孤立


有什么想法吗?

据我所知,我认为您正在使用该区域创建我的模块。 如果未显示,请参阅“使用区域组织ASP.NET MVC应用程序” 这可能是由于配置失误造成的


希望这能解决你的问题

根据您的代码I,它工作得非常好,因为您在配置文件中添加了两条路由


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

routes.MapRoute( 名称:“SanityRoute”, url:“我的模块/{controller}/{action}/{id}” 默认值:新建{controller:“Dashboard”,操作:“Index”}, 名称空间:新[]{Namespace.To.My.Isolated.Controllers} );

错误:两者的行为类似于默认URL。所以当你在工作的时候 并尝试重定向到其他URL路由将允许该URL,因为您将其作为默认设置

试试下面的代码就行了。。 routes.MapRoute( 名称:“默认”, url:“{controller}/{action}”, 默认值:新建{controller=“Home”,action=“Index”} );

routes.MapRoute( 名称:“仪表板路线”, url:“myModule/Dashboard/{action}”, 默认值:新建{action=“Index”} );


谢谢

我有点犹豫是否将其归类为“答案”,但正是这个答案让我开始运行,问题似乎源于上述路由配置基于
ActionLink
的调用似乎将
我的模块
放在了所有内容的前面,我仍然不知道为什么,似乎MVC正试图聪明地迫使路由匹配第一条路由的前缀(这似乎很奇怪),或者这个项目在某个地方有一些自定义URL重写魔法(我在任何地方都找不到,我不知道这会如何影响页面上的
ActionLink
调用)

无论如何,为了解决这个问题,我已经把默认路线放回最上面作为最高得分,并对其设置了一个限制,即控制器!='“我的模块”。这看起来像:

约束:新建{controller:“^((?!我的模块)。)*$”}


我仍然有点困惑,因为路由应该是匹配URL的规则,而不是强制执行URL的规则。无论如何,这让我又继续前进。

你是如何导航到URL的?通过在浏览器中键入它,重定向到某个操作,重定向到某个路由,等等?这取决于您指的是哪个url,系统中有一个重定向到其他索引页的登录页,我不知道该代码所在的位置,我想它位于6000行控制器中。这是进入系统的入口点,也是以
my module
为前缀的第一条路由,如果您是指我添加的其他路由,则它们是手动URL,因为前端由动态模板驱动,因此它不使用
@Html.ActionLink
等功能。我没有明确使用区域,我只是想将我的控制器与其他控制器隔离开来,所以我只是添加了前缀来过滤它们。据我所知,您可以这样做,因为路由只是一个模式匹配器,实际上它将委托给控制器。问题是,我需要明确指定该模块中的每个控制器,这并不是世界末日,但是如果有人想重命名路由等,则需要维护和更改更多代码。我只希望默认的一个像默认的一样,因为另一个有一个前缀,它没有被归类为动态变量,因此,它应该只匹配以
my module
开头的内容,但是它正在执行
操作