我有这种情况。
表单(ForexPayment)由用户填写,然后他/她点击下一步。
然后我只显示标签和值(即只读确认页面)的新页面(ForexPaymentConfirmation),这样他/她可以提交或取消请求。
我的问题:
如何使用return RedirectToAction("ForexPaymentConfirmation");
将包含付款信息的对象从一个视图传递到下一个视图?
一种选择是将付款信息存储在当前会话中并在新页面上回收...
有没有更好的方法来实现这一目标?
通过SO搜索,我发现:https://stackoverflow.com/a/7599952/44080表示:
您实际上是在尝试使用控制器来进行数据访问。
但是在这种情况下,我还没有保存付款,我需要在保存前预览不同的视图。
使用WebForms,我只需取消隐藏同一页面上的面板即可实现此目的。
答案 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.....
仅当您的模型包含值类型(int
,bool
DateTime
等)或string
的属性时,它才有效。如果任何属性是复杂对象或集合,则绑定将失败。此外,您可以轻松地超出查询字符串限制以及抛出和异常。
不清楚为什么你需要这种模式(而不是保存模型,然后在'详细'视图中有'删除'按钮',以防用户改变主意),但你需要在某个地方保留模型。您可以使用Session
(但不应使用TempData
),但最好将其持久保存到某种形式的存储库,例如数据库(可能是另一个“临时”表)或序列化它到一个xml文件,以便您可以在GET方法中检索它。另一种选择是将它存储在永久表中,但包含一个可以在“确认”时设置的位标志(比如bool IsPending
),在“取消”的情况下,只需删除表格行。 / p>