C# 从控制器RedirectToAction()下载文件

C# 从控制器RedirectToAction()下载文件,c#,asp.net-mvc,C#,Asp.net Mvc,我有一个旧的MVC1.0应用程序,我正在努力解决一些相对简单的问题 我有一个允许用户上传文件的视图 一些服务器端处理继续进行 最后,生成一个新文件并自动下载到客户机 我有第1步和第2步。我无法完成工作的最后一步。这是我的控制器: [AcceptVerbs(HttpVerbs.Post)] public ViewResult SomeImporter(HttpPostedFileBase attachment, FormCollection formCollection, string submi

我有一个旧的MVC1.0应用程序,我正在努力解决一些相对简单的问题

  • 我有一个允许用户上传文件的视图
  • 一些服务器端处理继续进行
  • 最后,生成一个新文件并自动下载到客户机
  • 我有第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});
    
    但是该文件没有下载。欢迎提出建议并提前表示感谢。

    尝试返回,因为它是动作输出中最抽象的类。ViewResult将强制您返回一个视图或PartialView,因此,返回一个文件将得到一个关于隐式转换类型的异常

    [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");
    }
    

    你为什么要采取行动?您可以从SomeImporter操作返回文件,只需将SomeImporter的返回类型更改为FileContentResult。

    RedirectToAction
    将HTTP重定向发送到浏览器,因此无法传递文件数据。你可以直接返回
    File()
    来代替重定向吗?你也可以将数据放入
    TempData
    (假设它在版本1中…不记得了)我已经尝试返回
    File()
    而不是
    RedirectToAction
    ,但它也不起作用。当您说将
    字节[]
    放入
    TempData
    时,如何从控制器的
    SomeImporter()
    下载它?返回
    文件()
    做了什么?有错误吗?要使用
    TempData
    ,您需要将字节放入其中
    TempData[“foo”]=fileBytes
    ,执行重定向,然后在下载操作中从中取出字节。好的……您还可以尝试返回
    ActionResult
    ,而不是
    ViewResult
    。哦。。我在早些时候的旅行中读到了这一点。我不知道为什么我没有尝试。谢谢