1

这是来自我的控制器的代码片段......这一切都从我的索引开始。

 public ActionResult Index(...){
       //some code here
       return GenerateReport(...);
    }

到目前为止...exporter.GenerateReport() 返回生成的excel文件的正确路径...

public ActionResult GenerateReport(...){
      string pathOfGeneratedFile = exporter.GenerateReport(...);
      return DownloadFile(pathOfGeneratedFile, "application/vnd.ms-excel");
}


public FileResult DownloadFile(string filePath, string contentType = "application/octet-stream"){
         return File(filePath, contentType, Path.GetFileName(filePath)); 
}

一路上实际上没有发生任何错误/异常......但我期待文件一旦生成就可以下载......我手动打开使用 OpenXMl 生成的文件,它确实打开并存储了所有信息那里...

这是我的视图...我对按钮的值进行了一些解析以反映 GenerateReport 用户操作...这将提交给 Index 操作,如果单击生成按钮,它将确定用户操作...

<input class="btn btn-primary pull-right" type="submit" value="Generate Report" name="userAction"/>

编辑:我认为我也使用了这个......

@using (Ajax.BeginForm(new AjaxOptions { HttpMethod = "Get", UpdateTargetId = "recordList", InsertionMode = InsertionMode.Replace }))

顺便说一句,一旦所有操作完成......我可以在我的视图中看到一个垃圾值。我只想下载文件。谢谢你。

4

1 回答 1

2

您无法下载文件的原因是您正在使用 AJAX 异步请求。AJAX 响应不能包含文件下载。你可以在你的控制器中尝试这样的事情:

public ActionResult Index(...) {
    var fileName = GenerateReport();

    // store the file name somewhere on the server - do NOT pass it through the URL.
    this.TempData["DownloadFileName"] = fileName;
    this.TempData["DownloadContentType"] = "application/vnd.ms-excel";
    this.TempData.Keep("DownloadFileName");
    this.TempData.Keep("DownloadContentType");

    return new JavaScriptResult() { Script = "document.location = \"" + this.Url.Action("Download") + "\";" };
}

public ActionResult Download() {
    return File((string)this.TempData["DownloadFileName"], (string)this.TempData["DownloadContentType"], Path.GetFileName(filePath)); 
}

因此,您的 AJAX 请求将导致重定向(不能使用 RedirectToAction,因为这将导致浏览器在 AJAX 请求内重定向)。然后,此重定向将指示浏览器以经典请求下载文件。

于 2012-11-15T09:01:57.010 回答