3

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

  1. 我有一个允许用户上传文件的视图。
  2. 一些服务器端处理继续进行。
  3. 最后,会生成一个新文件并自动下载到客户端的机器上。

我有第 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});

但文件不下载。欢迎提出建议并提前致谢。

4

2 回答 2

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");
}
于 2013-02-07T01:02:16.140 回答
2

为什么要做 RedirectToAction?您可以从 SomeImporter 操作返回 File,只需将 SomeImporter 的返回类型更改为 FileContentResult。

于 2013-02-07T01:05:53.597 回答