2010-07-24 31 views
6

我目前正在使用ASP.NET MVC 2.0开发电子商店。我已经完成了大部分工作,但是一直困扰着我的部分是路由。我想这一点: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个类别,路由表中是否有太多“路由”?你会建议另一种解决方案?

谢谢。

问候, 安泽

回答

5

与动态约束的单一路线可能是一个更好的解决方案。只需设置一个只与您的类别匹配的约束。

 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); 
      } 
     } 
} 
+0

太好了!这就像一个魅力!不知道路线限制。非常感谢! – 2010-07-24 13:32:09

+0

你好@tvanfosson,如果有5万个类别,性能如何?据我所知有一个路由表缓存或类似的东西,但在任何情况下,它从数据库检查。 – 2014-01-14 13:46:27