我有一个系统可以生成一个"地址"对于用作路径中某个段的页面。它可以包含分层路径:
解决方案/软件/列表
我想用这样的方式映射路线:
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
答案 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字典并将它们组合起来重建您的地址字段。