ASP.NET MVC路由:如何覆盖路由匹配

时间:2014-05-19 12:55:36

标签: asp.net-mvc asp.net-mvc-routing

我有一个系统可以生成一个"地址"对于用作路径中某个段的页面。它可以包含分层路径:

解决方案/软件/列表

我想用这样的方式映射路线:

routes.MapRoute(
    "Default", 
    "{address}/{action}", 
    new { controller = "Home",
      action = UrlParameter.Optional
    } //defaults
 );

地址可以包含类似"解决方案/软件"的分层路径。在这种情况下,List是Action名称。从地址段,我们可以找到正确的控制器和操作。其他例子可以是"解决方案/软件/ My-CRM-System"。

据我所知,如果{address}包含" /",MVC将无法匹配任何路由。是否可以覆盖路由匹配,所以我可以让它工作?

我知道我可以使用贪婪的捕获来实现我想要的大部分功能,但是我想让一个版本正常工作:http://erraticdev.blogspot.no/2011/01/custom-aspnet-mvc-route-class-with.html

2 个答案:

答案 0 :(得分:0)

您想要设置包含多个可选部分的路线。例如,在此路线中,解决方案/软件/我的客户关系管理系统,解决方案/软件是可选的,它们是您的地址部分的一部分。几个月前我遇到了类似的问题,我找到了解决方法。您可以找到它的详细信息here。使用该方法,您可以创建如下路径:

routes.MapRoute(
            name: "Test",
            url: "Test/{Country}/{Maker}/{Type}",
            defaults: new { controller = "Test", action = "Index", Country = UrlParameter.Optional, Maker = UrlParameter.Optional, Type = UrlParameter.Optional },
            lookupParameters: new string[] { "Country", "Maker", "Type" },
            routeValueService: new RouteValueService());

当然,您需要实现IRouteValueLookupService接口的自定义版本。

答案 1 :(得分:0)

假设您的地址中最多有4个部分。您可以通过以下方式定义路线:

routes.MapRoute(
            name: "Test",
            url: "{AddressPart1}/{AddressPart2}/{AddressPart3}/{AddressPart4}/{action}",
            defaults: new { controller = "Home", action = "Index", AddressPart1 = UrlParameter.Optional, AddressPart2 = UrlParameter.Optional, AddressPart3 = UrlParameter.Optional, AddressPart4 = UrlParameter.Optional},
            lookupParameters: new string[] { "AddressPart1", "AddressPart2", "AddressPart3", "AddressPart4" },
            lookupService: new LookupService());

在lookupService中,您必须指定哪个值属于哪个AddressPart。

在您的代码中,您可以访问AddressParts *的RouteData字典并将它们组合起来重建您的地址字段。