我有这个动作:
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(字符串, 串, System.Web.Routing.RouteValueDictionary)” 有一些无效的论点
和
参数3:无法转换 'System.Web.Mvc.FormCollection'来 'System.Web.Routing.RouteValueDictionary'
如果有人能指出我正确的方向,我会非常感激,我想我可能要编辑Global.asax文件,但我对此并不太熟悉。
感谢。
答案 0 :(得分:4)
您可以使用TempData对象。
TempData属性值存储在会话状态中。在设置TempDataDictionary值之后调用的任何操作方法都可以从对象获取值,然后处理或显示它们。 TempData的值一直存在,直到读取或会话超时为止。
This MSDN article解释了这一切。
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;
//...
}