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?
It is using the first route that is fully satisfied. Try putting your
SlugsAfterIdroute above theDefaultone.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
Defaultroute redundant as you provide a default value for theslugparameter.