The question is similar to asp.net mvc Html.ActionLink() keeping route value I don't want, but with a twist that makes it more complex.
Starting from a default new MVC3 app, I change the routes to:
routes.MapRoute(
"r1", // Route name
"{controller}/{id}/{action}"
);
routes.MapRoute(
"r2", // Route name
"{controller}/{action}"
);
Notice that the id comes before the action in the first.
Then in Home\Index.cshtml, I add:
@Url.Action("Index")
@Url.Action("Index", new { id = "blah" })
@Url.Action("Index", new { id = "" })
Now I navigate to /Home/Foo/Index and look at the 3 generated links. I get
- "/Home/Foo/Index"
- "/Home/blah/Index"
- "/Home/Index?id=Foo"
The first two make sense, and are using the first route.
But in the third link, which hits the second route, I don't understand why id=Foo is passed on the query string, given that I explicitly passed an empty id. I would expect it to just generate "/Home/Index".
Can anyone explain that, and suggest how I can get it not to show up?