如何在具有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 });
}
答案 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 模式的纯度。