使用RedirectToAction - MVC将信息传递给另一个操作

时间:2011-04-22 08:38:13

标签: c# asp.net-mvc routing redirecttoaction

我有这个动作:

    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文件,但我对此并不太熟悉。

感谢。

1 个答案:

答案 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;
  //...
}