从action2调用action1并使用action1

时间:2016-11-02 14:11:39

标签: asp.net-mvc

如果我发帖到" DoAny"动作并在动作中调用另一个名为" OtherAction"的动作,浏览器中的URL保留在" DoAny"的URL上。行动。 但它应该改为url"其他/行动"在浏览器中也是如此。 如何做到这一点?

 [Route("signup/finished")]
 public ActionResult DoAny([Deserialize] RegistrationModel rm){
  return OtherAction(rm);                                       
}

 [Route("other/action")]
 public ActionResult OtherAction([Deserialize] RegistrationModel rm){
  return View(rm);                                      
}
  1. 请求域名/注册/已完成
  2. 返回OtherAction的视图
  3. 但网址仍然指向域/注册/已完成,而不是域/其他/操作

1 个答案:

答案 0 :(得分:1)

您可以返回RedirectResult

[Route("signup/finished")]
public ActionResult DoAny([Deserialize] RegistrationModel rm)
{
   return RedirectToActoin("OtherAction");
}

这会向浏览器发送302响应,新的url作为位置标头值,浏览器将对该操作方法发出全新的Http请求。所以你不应该试图传递一个复杂的对象。

如果要传递的视图模型数据是精简简单DTO,则可以将其作为routedata参数传递。框架会将DTO转换为查询字符串并发送它。

return RedirectToActoin("OtherAction",rm);  

如果对象很复杂,您应该考虑某种持久性,并在下一个操作方法中将其读回。

您还应该考虑PRG模式。 PRG代表 POST - REDIRECT - GET 。使用此方法,您将在查询字符串中发出具有唯一ID的重定向响应,使用该响应,第二个GET操作方法可以再次查询资源并将某些内容返回到视图。

[Route("signup/finished")]
public ActionResult DoAny([Deserialize] RegistrationModel rm)
{
    // to do : Save to db
    var newUserId= 101; //replace with the newly inserted id
    return RedirectToAction("OtherAction", "Account", new { userId=newUserId} ); 
}      
public ActionResult OtherAction(int userId)
{
  // to do : Get data from userId and build rm object
  return View(rm);
}

在OtherAction中,您将使用此唯一ID查询数据并获取所需数据。

另请查看How do I include a model with a RedirectToAction?