使用RedirectToAction – MVC将信息传递给另一个动作

我有这个动作:

public ActionResult Report(AdminReportRequest reportRequest, FormCollection formVariables) { AdminEngine re = new AdminEngine(); AdminReport report = re.GetCompleteAdminReport(reportRequest); return View(report); } 

我想知道如何重定向到同一个控制器中的另一个动作,传递AdminReportRequest和FormCollection变量?

我有这样的想法:

  public ActionResult EarningsSalesReport(AdminReportRequest reportRequest, FormCollection formVariables) { if (!reportRequest.Download) { AdminEngine re = new AdminEngine(); AdminReport report = re.GetCompleteAdminReport(reportRequest); return View(report); } return RedirectToAction("ExcelSalesReport", reportRequest, formVariables); } public FileResult ExcelSalesReport(AdminReportRequest reportRequest, FormCollection formVariables) { AdminEngine re = new AdminEngine(); Stream SalesReport = re.GetExcelAdminReport(reportRequest); return new FileStreamResult(SalesReport, "application/ms-excel") { FileDownloadName = "SalesReport" + DateTime.Now.ToString("MMMM d, yyy") + ".xls" }; } 

这显然是错误的并且会引发一些错误,例如:

‘System.Web.Mvc.Controller.RedirectToAction(string,string,System.Web.Routing.RouteValueDictionary)’有一些无效的参数

参数3:无法从’System.Web.Mvc.FormCollection’转换为’System.Web.Routing.RouteValueDictionary’

如果有人能指出我正确的方向,我会非常感激,我想我可能要编辑Global.asax文件,但我对此并不太熟悉。

谢谢。

您可以使用TempData对象。

TempData属性值存储在会话状态中。 在设置TempDataDictionary值之后调用的任何操作方法都可以从对象获取值,然后处理或显示它们。 TempData的值一直持续到读取或会话超时为止。

这篇MSDN文章解释了这一切。

 public ActionResult EarningsSalesReport(AdminReportRequest reportRequest, FormCollection formVariables) { //... TempData["Report"] = reportRequest; //store to TempData //... } public FileResult ExcelSalesReport(AdminReportRequest reportRequest, FormCollection formVariables) { //... var report = TempData["Report"] as AdminReportRequest; //... }