Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/flash/4.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# UrlHelper.Action方法未使用第一个变量参数映射到正确的路由_C#_Asp.net_Asp.net Mvc_Asp.net Mvc 4_Routes - Fatal编程技术网

C# UrlHelper.Action方法未使用第一个变量参数映射到正确的路由

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

让我们看看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: 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”东西”。