4

如何使用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 });
    }
4

3 回答 3

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;
于 2012-05-25T09:51:08.907 回答
2

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

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

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

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

idRedirectToAction

    return RedirectToAction("Success", { id = Model.Id });
于 2012-05-25T09:54:07.050 回答
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模式的纯度。

于 2012-05-25T09:53:24.970 回答