代码之家  ›  专栏  ›  技术社区  ›  egoodberry

ASP.NET MVC 2中的内容感知路由映射

  •  1
  • egoodberry  · 技术社区  · 16 年前

    我正在使用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定义一个特殊的路由映射,并在 地点 在那之前单独控制。

    // 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的内容进行区分吗?

    提前谢谢,如果这个问题已经以不同的形式被问到,我会提前道歉。

    1 回复  |  直到 16 年前
        1
  •  1
  •   Necros    16 年前

    不确定你到底想要完成什么。当然,您不能用一个路由真正映射具有不同签名的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
    

    这条路线只会映射到动作索引、照片、新闻(以及你放在注册表中的其他内容)。表达)。

    推荐文章