2010-07-24 6 views
6

Attualmente sto lavorando su un e-store utilizzando ASP.NET MVC 2.0. Ho già preso tutto funzionante, ma la parte che mi ha infastidito è il routing. Voglio che questo:Routing dinamico MVC 2.0 per i nomi delle categorie in un negozio online

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

Finora sono stato in grado di risolverlo utilizzando:

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

Ma questo catture modo troppo che solo quello che vorrei.

Dopo la lettura attraverso alcune domande e risposte in tutto questo sito, ho trovato una soluzione interessante particolarmente che mi richiederebbe di registrare programatically un percorso per ciascuna delle mie categorie, quindi, in sostanza, che avrei fatto

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

Cosa ne pensi? E 'questa una buona idea? Probabilmente avrò circa 200 categorie, sono troppe "rotte" da avere nella tabella di routing? Vuoi suggerire un'altra soluzione?

Grazie.

saluti, Anže

risposta

5

Un percorso unico con un vincolo dinamica potrebbe essere una soluzione più elegante. Basta impostare un vincolo che corrisponde solo alle categorie.

 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 fantastico! Ha funzionato proprio come un incantesimo! Non conoscevo i vincoli del percorso. Molte grazie! –

+0

Ciao @tvanfosson, che dire delle prestazioni se ci sono 50K categorie. Per quanto ne so c'è una cache della tabella di routing o qualcosa del genere ma in ogni caso controlla da db. –

Problemi correlati