如何使用RedirectToAction将对象传递给MVC 5中的新Action

时间:2015-09-18 01:13:45

标签: asp.net redirect asp.net-mvc-5

我有这种情况。

表单(ForexPayment)由用户填写,然后他/她点击下一步

然后我只显示标签和值(即只读确认页面)的新页面(ForexPaymentConfirmation),这样他/她可以提交取消请求。

我的问题:

  • 如何使用return RedirectToAction("ForexPaymentConfirmation");将包含付款信息的对象从一个视图传递到下一个视图?

  • 一种选择是将付款信息存储在当前会话中并在新页面上回收...

  • 有没有更好的方法来实现这一目标?

通过SO搜索,我发现:https://stackoverflow.com/a/7599952/44080表示:

  

您实际上是在尝试使用控制器来进行数据访问。

但是在这种情况下,我还没有保存付款,我需要在保存前预览不同的视图。

使用WebForms,我只需取消隐藏同一页面上的面板即可实现此目的。

2 个答案:

答案 0 :(得分:1)

RedirectToAction方法存在重载。

protected internal RedirectToRouteResult RedirectToAction(
    string actionName,
    string controllerName,
    object routeValues
)

如何将对象作为routeValue传递?

return RedirectToAction("MyAction", "MyController", new RouteValueDictionary(paymentInfo)

并在您的行动中使用

public ActionResult SearchJob(PaymentInfopaymentInfo)
{
     Return View();
}

或者您也可以使用TempData["paymentInfo"]将数据从控制器传递到控制器。

斯蒂芬建议道。如果您使用Keep()来保留下一个请求的值,请使用TempData读取数据。或者您可以使用Session并在不再需要数据时将其取消。

答案 1 :(得分:1)

可以使用

将简单对象传递给GET方法
return RedirectToAction("ForexPaymentConfirmation", model);

但是,在内部会创建一个丑陋的查询字符串,其中包含属性的所有名称和值

../ForexPaymentConfirmation?somePropertyName=someValue&anotherPropertyName=AnotherValue.....

仅当您的模型包含值类型(intbool DateTime等)或string的属性时,它才有效。如果任何属性是复杂对象或集合,则绑定将失败。此外,您可以轻松地超出查询字符串限制以及抛出和异常。

不清楚为什么你需要这种模式(而不是保存模型,然后在'详细'视图中有'删除'按钮',以防用户改变主意),但你需要在某个地方保留模型。您可以使用Session(但不应使用TempData),但最好将其持久保存到某种形式的存储库,例如数据库(可能是另一个“临时”表)或序列化它到一个xml文件,以便您可以在GET方法中检索它。另一种选择是将它存储在永久表中,但包含一个可以在“确认”时设置的位标志(比如bool IsPending),在“取消”的情况下,只需删除表格行。 / p>