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

孤街浪徒 提交于 2019-11-30 19:00:18

When you use RedirectToAction(), internally, MVC will take the existing route data (including the Id value) to build the url. Even if you pass a null RouteValueDictionary, the existing route data will be merged with the new empty route value data.

The only way around this I can see is to use RedirectToRoute(), as follows:

return RedirectToRoute("Default", new { controller = "Customer", action = "Search"});

counsellorben

Try passing in new (empty) RouteValueDictionary in your controller

return RedirectToAction("Search", new System.Web.Routing.RouteValueDictionary{});

And here:

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

I don't even know how can it pick up the Customer controller, since you are not specifying it anywhere. Try providing both controller and action to ActionLink helper.

Try passing the current route data to methon in your controller action:

return RedirectToAction("Search", this.RouteData.Values);

Remove this part:

id = UrlParameter.Optional

may be resolve the problem; when you define "id" as an optional parameter, and you have the "Default" map, the "Default" and the "AdminRoute" are same together! regards.

I was having a similar problem. Route values that were passed to my controller action were being reused when I tried to redirect the user with RedirectToAction, even if I didn't specify them in the new RouteValueDictionary. The solution that I came up with (after reading counsellorben's post) with was to clear out the RouteData for the current request. That way, I could stop MVC from merging route values that I didn't specify.

So, in your situation maybe you could do something like this:

[CustomAuthorize]
[HttpGet]
public ActionResult Approve(int id)
{
    _customerService.Approve(id);
    this.RouteData.Values.Clear();  //clear out current route values
    return RedirectToAction("Search");  //Goes to bad url
}

I had a similar problem and was able to solve it by adding the id to the default route as well.

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

If there is truly no id in your default route then you could also try:

routes.MapRoute(
    "Default", 
    "{controller}/{action}", 
    new { controller = "Home", action = "Index", id = string.Empty });
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!