C# 为什么我的路线会被重定向,这并不';对我来说没有任何意义
我制定了以下两条路线:C# 为什么我的路线会被重定向,这并不';对我来说没有任何意义,c#,asp.net,asp.net-mvc,C#,Asp.net,Asp.net Mvc,我制定了以下两条路线: routes.MapRoute( "Admin", "admin/{controller}/{action}/{id}", new { controller = "Admin", action = "index", id = "" } ); 然后我有: routes.MapRoute( "
routes.MapRoute(
"Admin",
"admin/{controller}/{action}/{id}",
new { controller = "Admin", action = "index", id = "" }
);
然后我有:
routes.MapRoute(
"Default", // Route name
"{controller}/{action}/{id}", // URL with parameters
new { controller = "Home", action = "Index", id = "" } // Parameter defaults
);
所以这两个路由是相同的,除了第一个在URL中有/admin前缀
事情就是这样,我不知道如何解释:
当我去:
www.example.com/user/verify
它重定向到
www.example.com/admin/user/complete
而不是
www.example.com/user/complete
“验证”操作只是重定向到以下位置以完成:
返回重定向操作(“完成”、“用户”)
所有完整的操作都是填充ViewModel,然后调用视图
它如何重定向并将前缀/admin/添加到URL?我认为它是重定向到管理路由,因为管理路由是第一个具有所有匹配参数的路由(提供的情况下的控制器和操作)。如果你想使用类似的东西,你需要研究使用(MVC2)或使用命名路由重定向。管理员是你的控制器,你不需要管理员/控制器/操作默认路由工作正常 您所需要的只是一个管理员控制器,默认路由将为您找到它 ie{controller}/{action}/{id} 将/admin/addproduct发送给名为admin的控制器和名为addproduct的操作 如果您想要自定义的,例如,只需要添加管线 /产品/电视/高清电视/2 其中产品是控制器,最后3个是类别、子类别和页码 在控制器上,将其指向路线内
希望这是有意义的不确定控制器的具体结构,但您可以向第一个MapRoute添加约束,将其限制到您希望路由应用到的特定控制器:
routes.MapRoute(
"Admin",
"admin/{controller}/{action}/{id}",
new { controller = "Admin", action = "index", id = "" } ,
new { controller = "[Some regex Expression - e.g. Admin]" }
);
这将使路线仅适用于与控制器相关的路线。您还可以使用调试路由。取决于你是如何组织的,但就像@NickLarson所说的-听起来像是你使用MVC 2的区域功能。MVC在匹配路由器时自上而下,这就是你处理这个问题的原因。我改变了我的方式,请查看我的历史记录。现在慢慢地回去接受旧的,谢谢。事实上,ASP.NET MVC在路由匹配方面是懒惰的——说的是正则表达式。那么你说它实际上是在URL上添加了/admin吗?这根本没有道理!管理路由没有“完成”操作,因此不确定它为什么会找到匹配项。它是匹配的,因为参数(控制器、操作和id)都满足。第一条路线和第二条路线根本没有区别。/admin是否位于url的开头并不重要。如果此管理路由位于另一个区域,那么您应该使用区域约束,这已经在您的另一个问题中讨论过了-@Blankman您实际上是在告诉路由API查找第一个路由,该路由处理由调用
RedirectToAction(action,controller)
指定的控制器和操作。路由是按照输入的顺序进行检查的,因此它将始终首先到达您的管理路由,因为它处理所有指定的变量。我认为OP正在使用具有多个同名控制器的区域。他还可能正在搜索管理员前缀,以确定他是否也是管理员。我会将其视为链接到同一个控制器,但控制器逻辑将决定他是否应该访问该页面的管理控件。