C# Url.Action不适用于非标准MVC路由

C# Url.Action不适用于非标准MVC路由,c#,asp.net-mvc,c#-4.0,C#,Asp.net Mvc,C# 4.0,我无法使@Url.Action与具有非标准路由结构的区域一起工作 例如,如果我在仪表板区域注册此路线: context.MapRoute( "Dashboard_default", "Dashboard/{controller}/{action}/{id}", new { controller = "View", action = "Display", id = UrlParameter.Optional }

我无法使@Url.Action与具有非标准路由结构的区域一起工作

例如,如果我在仪表板区域注册此路线:

        context.MapRoute(
            "Dashboard_default",
            "Dashboard/{controller}/{action}/{id}",
            new { controller = "View", action = "Display", id = UrlParameter.Optional }
        );
然后在布局视图中,我调用:

        @Url.Action("Select", "View", new { area = "Dashboard" })
我得到了一个正确的url:/Dashboard/View/Select

但是,如果我将路由更改为包含可选的辅助id,如下所示:

        context.MapRoute(
            "Dashboard_default",
            "Dashboard/{controller}/{action}/{id}/{secondaryid}",
            new { controller = "View", action = "Display", id = UrlParameter.Optional, secondaryid = UrlParameter.Optional }
        );
那么对@Url.Action(…)的相同调用不会返回任何Url。如果我用实值指定这些可选参数,如下所示:

        @Url.Action("Select", "View", new { area = "Dashboard", id = 1, secondaryid = 2 })
我得到的返回值为:/Dashboard/View/Select/1/2

问题是,对于我在该区域中的某些操作,不需要id或辅助id,我希望生成的url不需要它们。如果我将它们设置为(int?)null,它仍然不起作用


我做错什么了吗?如果我没有在routeValues参数中指定id和secondaryid标记,Url.Action(…)不应该返回不带id和secondaryid标记的Url吗?

有多个可选参数会对路由造成麻烦。基本上,如果存在一组可选参数,则路由引擎无法(有故障)匹配一个或没有可选参数。有关更多信息,请查看此

由于您并不总是需要id或次要id,所以只需通过一些途径来处理这些情况

context.MapRoute(
            "Dashboard_IdAndSecondaryId",
            "Dashboard/{controller}/{action}/{id}/{secondaryid}",
            new { controller = "View", action = "Display"}
        );
context.MapRoute(
            "Dashboard_default_WithSecondaryId",
            "Dashboard/{controller}/{action}/{secondaryid}",
            new { controller = "View", action = "Display"}
        );

context.MapRoute(
            "Dashboard_default",
            "Dashboard/{controller}/{action}/{id}/",
            new { controller = "View", action = "Display", id = UrlParameter.Optional}
        );
现在,当您只发送一个Id、一个secondaryId或两者都发送时,您将拥有匹配的路由。我们可以删除前两个路由中的可选参数声明,因为为了匹配该路由,您必须发送所需的参数。如果不发送所需的参数,您将只希望最后一条路由匹配


当操作链接中只发送Id或不发送Id时,最后一个路由是默认路由。我相信这个命令也行得通,请记住,您希望您的路由按顺序从最特定到最不特定。

这是有效的,但我必须将中间路由更改为带id而不是次要id,然后将最后一个路由更改为不带id或次要id。因此,路由匹配是:带id和次要id,仅带id,最后一点是完全没有id。如果你从来没有单独发送过第二个id,那么你可能只能通过两条路线来实现这一点。基本上,删除我的第二条路线。然后,默认情况下,将采用一个只有id或没有参数的路由,再稍微清理一下路由表。不管怎么说,很高兴你成功了!