【问题标题】:MVC 2.0 dynamic routing for category names in an e-store电子商店中类别名称的 MVC 2.0 动态路由
【发布时间】:2010-07-24 12:50:00
【问题描述】:

我目前正在使用 ASP.NET MVC 2.0 开发电子商店。我已经启动并运行了大部分,但困扰我的部分是路由。我想要这个:

http://mystore.somewhere/my-category-1/

到目前为止,我已经能够使用以下方法解决它:

routes.MapRoute(
            "Category",
            "{alias}/{pageNumber}",
            new { controller = "Categories", action = "Browse", pageNumber = 1 });

但这比我想要的要多得多。

在阅读了有关该站点的一些问题和答案后,我发现了一个特别有趣的解决方案,该解决方案需要我以编程方式为我的每个类别注册一条路线,所以本质上我会这样做

 foreach (var c in Categories)
        {
            routes.MapRoute(
                c.Name,
                "{" + c.Alias + "}/{action}/...anything else",
                new { controller = "Category", action = "Index" }).RouteHandler = new CateegoryRouteHandler(c);
        }

你怎么看?这是一个好主意吗?我可能会有大约 200 个类别,路由表中的“路由”是否太多?您会建议其他解决方案吗?

谢谢。

问候, 安泽

【问题讨论】:

    标签: asp.net-mvc-2 c#-4.0 url-routing


    【解决方案1】:

    具有动态约束的单一路由可能是更优雅的解决方案。只需设置一个仅与您的类别匹配的约束。

         routes.MapRoute(
            "Category",
            "{alias}/{pageNumber}",
            new { controller = "Categories", action = "Browse", alias = UrlParameter.Optional, pageNumber = 1 },
            new { alias = new CategoryMatchConstraint() } );
    
    
     public class CategoryMatchConstraint : IRouteConstraint
     {
          public bool Match( HttpContextBase httpContext,
                             Route route,
                             string parameterName,
                             RouteValueDictionary values,
                             RouteDirection routeDirection )
          {
               var category = values.Values[parameterName] as string;
               if (string.IsNullOrEmpty(category))
               {
                    return false;
               }
               using (var db = new MyDatabaseContext())
               {
                    return db.Categories.Any( c => c.Name == category );
               }
          }
    }
    

    【讨论】:

    • 哦,太好了!这就像一个魅力!不知道路线限制。非常感谢!
    • 你好@tvanfosson,如果有 50K 个类别,性能如何。据我所知,有一个路由表缓存或类似的东西,但无论如何它都会从数据库中检查。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-05
    • 1970-01-01
    • 2017-01-04
    • 2020-08-06
    • 2020-12-13
    • 2021-03-23
    相关资源
    最近更新 更多