从控制器RedirectToAction()下载文件

时间:2013-02-07 00:39:10

标签: c# asp.net-mvc

我有一个旧的MVC 1.0应用程序,我正在努力解决相对简单的问题。

  1. 我有一个允许用户上传文件的视图。
  2. 一些服务器端处理继续进行。
  3. 最后,生成一个新文件并自动下载到客户端的计算机上。
  4. 我有步骤1和2工作。我无法完成最后一步。这是我的控制器:

    [AcceptVerbs(HttpVerbs.Post)]
    public ViewResult SomeImporter(HttpPostedFileBase attachment, FormCollection formCollection, string submitButton, string fileName
    {
        if (submitButton.Equals("Import"))
        {
            byte[] fileBytes = ImportData(fileName, new CompanyExcelColumnData());
            if (fileBytes != null)
            {
                RedirectToAction("DownloadFile", "ControllerName", new { fileBytes = fileBytes});
            }
            return View();
        }
        throw new ArgumentException("Value not valid", "submitButton");
    }
    
    public FileContentResult DownloadFile(byte[] fileBytes)
    {
        return File(
                    fileBytes,
                    "application/ms-excel",
                    string.Format("Filexyz {0}", DateTime.Now.ToString("yyyyMMdd HHmm")));
    }
    

    代码执行:

    RedirectToAction("DownloadFile", "ControllerName", new { fileBytes = fileBytes});
    

    但文件未下载。建议欢迎并提前感谢。

2 个答案:

答案 0 :(得分:4)

尝试返回ActionResult,因为它是动作输出中最抽象的类。 ViewResult将强制您返回View或PartialView,因此,返回File将获得有关隐式转换类型的异常。

[HttpPost]
public ActionResult SomeImporter(HttpPostedFileBase attachment, FormCollection formCollection, string submitButton, string fileName
{
    if (submitButton.Equals("Import"))
    {
        byte[] fileBytes = ImportData(fileName, new CompanyExcelColumnData());
        if (fileBytes != null)
        {
            return File(
                fileBytes,
                "application/ms-excel",
                string.Format("Filexyz {0}", DateTime.Now.ToString("yyyyMMdd HHmm")));
        }
        return View();
    }
    throw new ArgumentException("Value not valid", "submitButton");
}

答案 1 :(得分:2)

为什么选择RedirectToAction?你可以从SomeImporter动作返回File,只需将SomeImporter的返回类型更改为FileContentResult。