C# UrlHelper.Action方法未使用第一个变量参数映射到正确的路由
让我们看看RouteConfig.cs中映射的这两条路由,一条有guid,另一条没有guid:C# UrlHelper.Action方法未使用第一个变量参数映射到正确的路由,c#,asp.net,asp.net-mvc,asp.net-mvc-4,routes,C#,Asp.net,Asp.net Mvc,Asp.net Mvc 4,Routes,让我们看看RouteConfig.cs中映射的这两条路由,一条有guid,另一条没有guid: // Non-guid route routes.MapPageRoute( name: null, url: "dashboard/{action}", defaults: new { controller = "Dashboard", action = "Index" } ); // Guid route routes.MapPageRoute( name: nul
// Non-guid route
routes.MapPageRoute(
name: null,
url: "dashboard/{action}",
defaults: new { controller = "Dashboard", action = "Index" }
);
// Guid route
routes.MapPageRoute(
name: null,
url: "{guid}/dashboard/{action}",
defaults: new { controller = "Dashboard", action = "Index" }
);
和方法调用:
UrlHelper.Action("Index", "Dashboard", new { guid = "c73b47b9-4ad5-414a-a92e-8937231f8e2bD" })
该方法返回以下内容:
"/dashboard/?guid=c73b47b9-4ad5-414a-a92e-8937231f8e2b"
但我期待着:
"/c73b47b9-4ad5-414a-a92e-8937231f8e2b/dashboard/"
请注意,它将guid作为querystring值而不是第一个参数
现在,如果我硬编码第二个url,应用程序将使用正确的guid路由,如果我使用路由名称(UrlHelper.RouteUrl),应用程序也会工作,因此我认为路由映射本身没有问题。这两种解决方案都不能很好地与我们的应用程序配合使用,因为我们有数百条路由,并且目前到处都在使用UrlHelper.Action
我还尝试了UrlHelper.Action的几乎所有重载和变体,包括传递RouteValueDictionary而不是匿名对象
这是一个ASP.NETMVC4Web应用程序
你知道为什么这不起作用吗?(或备选方案,可能使用一条路线)
试试这个。将更具体的路线放在第一位:
routes.MapRoute(
name: "WithGUID",
url: "{guid}/dashboard/{action}",
defaults: new { controller = "Dashboard", action = "Index" }
);
routes.MapRoute(
name: "NoGUID",
url: "dashboard/{action}",
defaults: new { controller = "Dashboard", action = "Index", guid = "" }
);
您的第一条路线正在捕获您希望被第二条路线捕获的路线。你试过把第二个放在第一个之前吗?您应该始终从更具体的路由转到不太具体的路由。您可能需要添加这样一个guid约束,谢谢!在最初的示例中,路由引擎似乎要转到第一个路由,并说“嘿,这个路由匹配只需要在末尾抛出这个“guid”东西”。