Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/36.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
C# 为什么我的路线会被重定向,这并不';对我来说没有任何意义_C#_Asp.net_Asp.net Mvc - Fatal编程技术网

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正在使用具有多个同名控制器的区域。他还可能正在搜索管理员前缀,以确定他是否也是管理员。我会将其视为链接到同一个控制器,但控制器逻辑将决定他是否应该访问该页面的管理控件。