2010-07-24 13 views
6

Ich arbeite derzeit an einem E-Store mit ASP.NET MVC 2.0. Ich habe das meiste schon aufgebaut, aber der Teil, der mich gestört hat, ist das Routing. Ich möchte dies:MVC 2.0 dynamisches Routing für Kategorienamen in einem E-Store

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

Bisher habe ich in der Lage gewesen, es zu lösen, indem sie mit:

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

Aber das fängt viel zu viel, als genau das, was Ich mag würde. so im Wesentlichen

Nach etwa dieser Seite durch einige Fragen und Antworten zu lesen, fand ich eine besonders interessante Lösung, die mich programmatisch eine Route für jedes meiner Kategorien registrieren erfordern würde, würde ich

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

Was denkst du? Ist das eine gute Idee? Ich werde wahrscheinlich etwa 200 Kategorien haben, sind das zu viele "Routen" in der Routing-Tabelle? Würden Sie eine andere Lösung vorschlagen?

Danke.

Regards, Anže

Antwort

5

eine einzige Route mit einer dynamischen constraint könnte eine elegantere Lösung. Richten Sie einfach eine Einschränkung ein, die nur Ihren Kategorien entspricht.

 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

Oh großartig! Das hat genau wie ein Charme funktioniert! Ich wusste nichts über die Einschränkungen der Route. Danke vielmals! –

+0

Hallo @tvanfosson, was ist mit der Leistung, wenn es 50K Kategorien gibt. Soweit ich weiß, gibt es eine Routentabellen-Caching oder etwas ähnliches, aber auf jeden Fall überprüft es von db. –