ASP.NET MVC Url.Action adds current route values to generated url

willvv picture willvv · Aug 20, 2011 · Viewed 33.5k times · Source

I have seen this question a couple of times here in SO but none of them with any acceptable answer:

ASP.NET MVC @Url.Action includes current route data
ASP.NET MVC implicitly adds route values

Basically I have Controller with an action method called Group, it has an overload that receives no parameters and displays a list of elements and another one that receives an id and displays details for that group.

If I do something like this:

Url.Action("Group", "Groups");

From the main page of the site (/) it returns an url like this:

"mysite.com/Groups/Group"

which is alright Now, if the current address of the site is /Groups/Group/1 And I call the same method

Url.Action("Group", "Groups");

the returned url is this:

"mysite.com/Groups/Group/1"

It automatically adds the value of the route for the current page when generating the URL. Even if I generate the URL this way:

Url.Action("Group", "Groups", null);

Thus explicitly specifying that I don't want any route values, the generated URL is the same. To get the address I want I have to explicitly set the route value to an empty string, like so:

Url.Action("Group", "Groups", new {id=""});

This will generate the following url:

"mysite.com/Groups/Group"

My question is, why does this happen? If I don't set any route values it shouldn't add them to the generated URL.

Answer

objectbox picture objectbox · Aug 20, 2011

Url.Action will reuse the current request parameters, if you do not explicitly set them. It is by design in outbound url-matching algorithm. When looking for the route data parameters in a process of generating url, parameters are taken from:

1) explicitly provided values

2) values from the current request

3) defaults

In the order I specified above.

Outbound matching algorithm for routes is complicated, so it is good practice to explicitly set all parameters for request, as you did in your example