[英]MVC 5 - RedirectToAction - Cannot pass parameter correctly
我有一种方法,如下所示:
[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。但是,即使我要传递带有值的实例化对象,第二个参数Sighting始终为null。 我究竟做错了什么?
记住, HTTP是无状态的!
RedirectToAction
方法将302响应返回到客户端浏览器,因此浏览器将向指定的URL发出新的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
对象存储数据。 但是一旦读取数据,数据就会终止。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.