2010-07-24 28 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