MVC 5 - RedirectToAction - 无法正确传递参数

时间:2014-04-20 16:28:05

标签: asp.net-mvc

我的方法如下:

[Authorize]
public ActionResult Create(int? birdRowId, Entities.BirdSighting sighting)
{
   ...
   ...
}

我想从同一个控制器中的另一个方法调用上面的方法如下:

   [Authorize]
   [HttpPost]
   public ActionResult Create(Entities.BirdSighting birdSighting, FormCollection collection)
    {
    ...
    ...

    return RedirectToAction("Create", new {birdRowId = 10, sighting = birdSighting}); 
    }

RedirectToAction方法正确调用该方法。并且,被调用方法的第一个参数(birdRowId)确实等于10.但是,即使我正在传递具有值的实例化对象,第二个参数瞄准也始终为null。我做错了什么?

1 个答案:

答案 0 :(得分:9)

请记住, HTTP无国籍!

RedirectToAction方法会向客户端浏览器返回 302 响应,因此浏览器会向指定的网址发出新的 GET 请求。

如果您尝试遵循PRG模式,我认为您不应该尝试传递复杂对象。您应该只传递资源的ID,以便GET操作可以使用该ID再次构建资源(模型)。

return RedirectToAction("Created", "YourControllerName", new { @id=10} );

并在Created操作中,阅读id并在那里构建对象。

public ActionResult Created(int id)
{
  BirdSighting sighting=GetSightingFromIDFromSomeWhere(id);
  // to do  :Return something back here (View /JSON etc..)
}

如果您确实希望跨(无状态)HTTP请求传递一些数据,您可以使用一些临时存储机制,例如 TempData

在HttpPost操作方法中将对象设置为TempData。

[HttpPost]
public ActionResult Create(BirdSighting birdSighting, FormCollection collection)
{
 // do something useful here
  TempData["BirdSighting"] =birdSighting;
  return RedirectToAction("Created", "YourControllerName");
}

在您的GET操作方法中,

public ActionResult Created()
{      
  var model=TempData["BirdSighting"] as BirdSighting;
  if(model!=null)
  {
     //return something
  } 
  return View("NotFound");
}

TempData使用场景后面的Session对象来存储数据。但是一旦读取数据,数据就会终止。