Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

MVC 2.0 dynamic routing for category names in an e-store

I'm currently working on an e-store using ASP.NET MVC 2.0. I already got most of it up and running, but the part that's been bothering me is routing. I want this:

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

So far I've been able to solve it by using:

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

But this catches way too much than just what I'd like.

After reading through some questions and answers around this site, I found a particulary interesting solution that would require me to programatically register a route for each of my categories, so in essence I'd be doing

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

What do you think? Is this a good idea? I'm probably going to have about 200 categories, is that too much "routes" to have in the routing table? Would you suggest another solution?

Thanks.

Regards, Anže

like image 519
Anže Vodovnik Avatar asked Jul 24 '10 12:07

Anže Vodovnik


1 Answers

A single route with a dynamic constraint might be a more elegant solution. Just set up a constraint that only matches your categories.

     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 );
           }
      }
}
like image 160
tvanfosson Avatar answered Sep 28 '22 19:09

tvanfosson