使用redirectAction和prg模式在操作之间发送数据

时间:2012-05-25 09:47:44

标签: asp.net-mvc-3

如何在具有redirectAction的动作之间发送数据?

我正在使用PRG模式。我想做出类似的东西

[HttpGet]
    [ActionName("Success")]
    public ActionResult Success(PersonalDataViewModel model)
    {
        //model ko
        if (model == null)
            return RedirectToAction("Index", "Account");

        //model OK
        return View(model);
    }

    [HttpPost]
    [ExportModelStateToTempData]
    [ActionName("Success")]
    public ActionResult SuccessProcess(PersonalDataViewModel model)
    {

        if (!ModelState.IsValid)
        {
            ModelState.AddModelError("", "Error");
            return RedirectToAction("Index", "Account");
        }

        //model OK
        return RedirectToAction("Success", new PersonalDataViewModel() { BadgeData = this.GetBadgeData });
    }

3 个答案:

答案 0 :(得分:9)

重定向时,您只能传递查询字符串值。不是完整的复杂对象:

return RedirectToAction("Success", new {
    prop1 = model.Prop1,
    prop2 = model.Prop2,
    ...
});

这仅适用于标量值。因此,您需要确保在查询字符串中包含所需的每个属性,否则它将在重定向中丢失。

另一种可能性是将您的模型保存在服务器上的某个位置(如数据库或其他东西),并且在重定向时只传递允许检索模型的id:

int id = StoreModel(model);
return RedirectToAction("Success", new { id = id });

并在Success操作内部检索模型:

public ActionResult Success(int id)
{
    var model = GetModel(id);
    ...
}

另一种可能性是使用TempData,但我个人不建议:

TempData["model"] = model;
return RedirectToAction("Success");

并在Success操作内部从TempData获取它:

var model = TempData["model"] as PersonalDataViewModel;

答案 1 :(得分:2)

你不能在使用对象的动作之间传递数据,正如Darin所提到的,你只能传递标量值。

如果您的数据太大,或者不仅包含标量值,您应该执行以下操作

[HttpGet]
public ActionResult Success(int? id)
{
    if (!(id.HasValue))
        return RedirectToAction("Index", "Account");

    //id OK
    model = LoadModelById(id.Value);
    return View(model);
}

id

传递RedirectToAction
    return RedirectToAction("Success", { id = Model.Id });

答案 2 :(得分:0)

RedirectToAction方法向浏览器返回HTTP 302响应,这会导致浏览器对指定的操作发出GET请求。所以你不能像调用复杂对象的其他方法一样传递复杂的对象。

您可能的解决方案是使用GET动作传递id可以再次构建对象。像这样的事情

[HttpPost]
public ActionResult SuccessProcess(PersonViewModel model)
{
  //Some thing is Posted (P) 
  if(ModelState.IsValid)
  {
    //Save the data and Redirect (R)
    return RedirectToAction("Index",new { id=model.ID});
  }
  return View(model)
}

public ActionResult Index(int id)
{
  //Lets do a GET (G) request like browser requesting for any time with ID
  PersonViewModel model=GetPersonFromID(id);
  return View(id);
}

}

您也可以使用Session保持This Post和GET请求之间的数据(复杂对象)(TempData在内部使用会话甚至)。但我相信它会消除 PRG 模式的纯度。