我的方法如下:
[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。我做错了什么?
答案 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
对象来存储数据。但是一旦读取数据,数据就会终止。