C# – Why the query strings in the ASP.NET MVC route

asp.netasp.net-mvcc++routing

On an ASP.NET MVC (Beta) site that I am developing sometimes calls to ActionLink will return to me URLs containing querying strings. I have isolated the circumstances that produce this behavior, but I still do not understand why, instead of producing a clean URL, it decides to using a query string parameter. I know that functionally they are the same, but for consistency (and appearance) of the URLs this is not what I want.

Here are my routes:

routes.MapRoute(
    "Photo Gallery Shortcut",
    "group/{groupname}",
    new { controller = "Photos", action = "All", Id = "" });

routes.MapRoute(
    "Tagged Photos", //since the Tagged action takes an extra parameter, put it first
    "group/{groupname}/Photos/Tagged/{tagname}/{sortby}",
    new { controller = "Photos", action = "Tagged", Id = "", SortBy = "" });

routes.MapRoute(
    "Photo Gallery", //since the Gallery's defualt action is "All" not "Index" its listed seperatly
    "group/{groupname}/Photos/{action}/{sortby}",
    new { controller = "Photos", action = "All", Id = "", SortBy = "" });

routes.MapRoute(
    "Group",  //<-- "Group" Category defined above
    "group/{groupname}/{controller}/{action}/{id}",
    new {controller = "Photos", action = "Index", Id = ""});

Now the problem only occurs when I am looking at the view described by the route named "Tagged Photos" and execute ActionLink via:

Html.ActionLink<PhotosController>(p => p.All((string)ViewData["group"], ""), "Home")

Which produces the URL:

http://domain/group/GROUPNAME?sortBy=

From any other view the URL produced is:

http://domain/group/GROUPNAME

I have pulled down Phil's ASP.NET Routing Debugger, and everything appears in order. This one has me stumped. Any ideas?

Best Solution

Not sure why different views are producing different URLs.

But you can get rid of that sortBy param by assigning a default value to the first route.

new { sortBy = "" }

During generation, if sortBy matches the default, the route engine will skip that parameter (if it's in the query string).