If you review a SO question URL you will see that an ID and a "SLUG" are passed to the Questions controller: https://stackoverflow.com/questions/676934/what-do-you-need-to-write-your-own-blog-engine. What I find interesting is you can change the "SLUG" portion of the URL without affecting the application's ability to route the request example. The only way I could think to pull this off is have a route that accepted an id and a "SLUG" and used a route constraint on the slug to ensure it followed a pattern. I had to use a constraint to ensure that having the two variables didn't result in this route matching all requests. Does anyone have a better way to accomplish this, or any examples of more advanced routing scenarios?
ADDITION:
I realize the SLUG is for human readablity, and I would like to duplicate this feature in another application. What is the best way to accomplish this.
Route:
routes.MapRoute( "Id + Slug", // Route name "Test/{id}/{slug}", // URL with parameters new // Parameter defaults { controller = "Test", action = "Details", id = "", slug = "" }, new { slug = new SlugConstraint() } ); Simple Constraint:
public class SlugConstraint : IRouteConstraint { public bool Match(HttpContextBase httpContext, Route route, string parameterName, RouteValueDictionary values, RouteDirection routeDirection) { string value = values[parameterName].ToString(); return value.Contains("-"); } }