ASP.NET MVC URL Routing with Multiple Route Values

Ian Oxley picture Ian Oxley · Apr 9, 2009 · Viewed 65.6k times · Source

I am having trouble with Html.ActionLink when I have a route that takes more than one parameter. For example, given the following routes defined in my Global.asax file:

routes.MapRoute(
    "Default",                                              // Route name
    "{controller}.mvc/{action}/{id}",                           // URL with parameters
    new { controller = "Home", action = "Index", id = "" }  // Parameter defaults
);

routes.MapRoute(
    "Tagging",
    "{controller}.mvc/{action}/{tags}",
    new { controller = "Products", action = "Index", tags = "" }
);

routes.MapRoute(
    "SlugsAfterId",
    "{controller}.mvc/{action}/{id}/{slug}",
    new { controller = "Products", action = "Browse", id = "", slug = "" }
);

The first two routes work without a problem, but when I try to create an action link to the third route using:

<%= Html.ActionLink(Html.Encode(product.Name), "Details", new { id = product.ProductId, slug = Html.Encode(product.Name) }) %>

I end up with a URL like [site-root]/Details/1?slug=url-slug whereas I would like the URL to be more like [site-root]/Details/1/url-slug

Can anyone see where I am going wrong?

Answer

Garry Shutler picture Garry Shutler · Apr 9, 2009

It is using the first route that is fully satisfied. Try putting your SlugsAfterId route above the Default one.

It's basically going: "Check Default. Got an action? Yes. Got an id? Yes. Use this one and chuck any other parameters in the querystring."

As a side note, doing that will make your Default route redundant as you provide a default value for the slug parameter.