I'm using ASP.Net MVC. Here's my code snippets from a controller named Course:
public ActionResult List(int id)
{
var viewmodel.ShowUrl = Url.Action("Show", "Course");
...
}
public ActionResult Show(int id)
{
...
}
viewmodel.ShowUrl picks up whatever the value is of the "id" parameter. So viewmodel.ShowUrl becomes "/Course/Show/151" (value of id is 151); I want to be able to set the id part on the client based on user interaction. I want the value of viewmodel.ShowUrl to be "/Course/Show".
This seems like a bug to me. I'm not telling Url.Action to include an id value. It's doing it on its own. If I want to set the id value then I would do something like this:
var viewmodel.ShowUrl = Url.Action("Show", "Course", new {id = somevalue});
So, how do you prevent MVC from adding the id value? I can hardcode viewmodel.ShowUrl to "/Course/Show" but that seems to be a kludgy solution. Thanks.
I'm guessing in your routing, you're not specifying that id is an optional parameter. Here's the default route in a sample project.
routes.MapRoute(
"Default", // Route name
"{controller}/{action}/{id}", // URL with parameters
new { controller = "Home", action = "Index", id = UrlParameter.Optional } //Parameter defaults
);
Note the inclusion of id = UrlParameter.Optional
. Without that, you'd get the behavior you're describing because it thinks the id is mandatory.
On a side note, if your Show action doesn't always have an id then it should be nullable or provide a default.
public ActionResult Show(int? id)
public ActionResult Show(int id = 0)
Otherwise you'll get an error when you try loading the url without the id parameter.
Just came across the same problem and so you know, you can also just use an empty string:
@Url.Action("Show", "Course", new { id = "" })
I know this is old, but I found this first, but didn't like any of these solutions, so I kept looking and found https://stackoverflow.com/a/19110921/1130636.
You can use UrlParameter.Optional
to solve this problem
Url.Action("Show", "Course", new { id = UrlParameter.Optional })