Switching to {controller}/{id}/{action} breaks RedirectToAction

Viewed 2270

I am trying to use proper REST urls with MVC. To do that I switched default Routing from:

{controller}/{action}/{id}

to

{controller}/{id}/{action}

so instead of:

/Customer/Approve/23

there is now

/Customer/23/Approve

ActionLink seems to work ok, but the following code in CustomerController:

[CustomAuthorize]
[HttpGet]
public ActionResult Approve(int id)
{
    _customerService.Approve(id);
    return RedirectToAction("Search");  //Goes to bad url
}

ends up on url /Customer/23/Search. While it should be going to /Customer/Search. Somehow it remembers 23 (id).

Here is my routing code in global.cs

    routes.MapRoute(
        "AdminRoute", // Route name
        "{controller}/{id}/{action}", 
        new { controller = "Home", action = "Index", id = UrlParameter.Optional },
        new { id = new IsIntegerConstraint() }
        );

    routes.MapRoute(
        "Default", 
        "{controller}/{action}", 
        new { controller = "Home", action = "Index" });

If I switch the two functions, RedirectToAction starts working, but using:

Html.ActionLink("Approve", "Approve", new { Id = 23})

Now generates /Customer/Approve?id=23, instead of /Customer/23/Approve.

I could specify direct urls like ~/Customer/23/Approve, instead of using ActionLink and RedirectToAction, but would rather stick to functions provided by MVC.

6 Answers
Related