我在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对象是正确的。注入参数是唯一出错的地方。
以下是一些描述问题的屏幕截图:
控制器中的RouteData对象以及在调试会话中传递的错误值:
我已经尝试使用RouteValueDictionary,因为这个SO Q& A:https://stackoverflow.com/a/1300844/2359643,但它没有帮助解决问题。我有其他操作(没有使用' PUT',而是POST,GET和DELETE)返回从ActionResult
调用生成的完全相同的RedirectToAction()
,并且按预期运作。有没有其他人遇到这个问题,如果是这样,你是如何解决它的?我在这里做错了会导致这种行为吗?
答案 0 :(得分:1)
我不确定这一点,但您可以尝试将ShipmentStatus的参数名称从id更改为其他内容,并确保调试到UpdateDelivery即将重定向的位置,这样您就可以对它进行双重确认