我正在使用ASP.NET MVC 2并希望优化我的路由。期望的结果如下:
http://www.url.com/Sites/
http://www.url.com/Sites/Search/NY001
http://www.url.com/Sites/NY001
http://www.url.com/Sites/NY001/Photos
这种情况的问题在于,我想在某种意义上根据内容的不同对待URL位。可以想象,“NY001”是特定网站的标识符,而不是Sites
控制器中的操作。我目前的解决方案是为站点特定的URL定义一个特殊的路由映射,并在此之前单独指定Sites
控制器中的每个操作。
// currently in place, works
routes.MapRoute("SiteList", "Sites", new { controller = "Sites", action = "Index" });
routes.MapRoute("SiteSearch", "Sites/Search/{searchString}", new { controller = "Sites", action = "Index", searchString = "" });
routes.MapRoute("SiteNotFound", "Sites/NotFound", new { controller = "Sites", action = "NotFound" });
// and so on...
routes.MapRoute("Site", "Sites/{siteId}/{action}", new { controller = "Sites", action = "Index", siteId = "" });
由于这是我的Web应用程序的核心组件之一,因此这些操作每天都在增长,并且列表变得有点笨拙。我希望能够将一长串特定于行动的路线提炼为单一的声明,类似于:
routes.MapRoute("Sites", "Sites/{action}/{id}", new { controller = "Sites", action = "Index", id = UrlParameter.Optional });
问题是路由框架无法区分上述示例中的新路由和特定于站点的路由;因此,两者都是匹配。我是否坚持单独宣布每项行动?我应该考虑使用正则表达式来区分URL的内容吗?
提前致谢,如果已经以不同的形式提出这个问题,我会提前道歉。
答案 0 :(得分:1)
不确定你想要完成什么。当然,您无法使用一条路线真正映射具有不同签名的URL,但您可以像这样缩小列表:
routes.MapRoute("Site", "Sites/{siteId}/{action}", new { controller = "Sites", action = "Index" }, new { action = "(?:Index|Photos|News)", siteId = @"[A-Z0-9]+" });
表示网址:
http://www.url.com/Sites/NY001
http://www.url.com/Sites/NY001/Photos
http://www.url.com/Sites/NY001/News
此路线只会映射到操作索引,照片,新闻(以及您在该注册表达式中放置的任何其他内容)。