调用RedirectToAction时使用的旧路由数据

时间:2016-10-12 20:18:55

标签: c# asp.net asp.net-mvc redirect asp.net-mvc-5

我在ASP.NET MVC 5应用程序中解决了一些关于路由的非常奇怪的行为。

我使用RouteAttributes来描述以下两个操作中的URI:

[Route("status/{id:int}")]
public ActionResult ShipmentStatus(int id)
{ //do stuff & return partial view }

[HttpPut]
[Route("delivery/{id:int}")]
public ActionResult UpdateDelivery(int id, DeliveryModel model)
{
     //do stuff with model to update db
     return RedirectToAction("ShipmentStatus", new { id = model.ShipmentId });
}

我们假设我向URI "/shipment/delivery/12345"提交了PUT请求,模型包含ShipmentId = 54321。调试时我发现54321在RouteData内,重定向到URI "/shipment/status/54321",但是在ShipmentStatus方法中,ASP.NET id注入方法的参数值为12345,当发出原始put请求而不是传递给RedirectToAction方法的route对象中的值时,先前发送到控制器的id。奇怪的是,重定向期间生成了正确的URI。重定向方法中控制器的RouteData对象是正确的。注入参数是唯一出错的地方。

以下是一些描述问题的屏幕截图:

从重定向调用传递的生成的URI: Browser Console

控制器中的RouteData对象以及在调试会话中传递的错误值: RouteData Debugging

我已经尝试使用RouteValueDictionary,因为这个SO Q& A:https://stackoverflow.com/a/1300844/2359643,但它没有帮助解决问题。我有其他操作(没有使用' PUT',而是POST,GET和DELETE)返回从ActionResult调用生成的完全相同的RedirectToAction(),并且按预期运作。有没有其他人遇到这个问题,如果是这样,你是如何解决它的?我在这里做错了会导致这种行为吗?

1 个答案:

答案 0 :(得分:1)

我不确定这一点,但您可以尝试将ShipmentStatus的参数名称从id更改为其他内容,并确保调试到UpdateDelivery即将重定向的位置,这样您就可以对它进行双重确认