这是我控制器的代码片段...这一切都从我的索引开始。
public ActionResult Index(...){
//some code here
return 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 生成的文件,它确实打开了,所有信息都存储在那里......
这是我的观点...我对按钮的值进行了一些分析,以反映生成报告用户操作。这将提交到索引操作,如果单击生成按钮,它将确定用户操作...
<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 }))
顺便说一句,一旦所有操作完成...我可以在我的视图中看到垃圾值。我只想下载文件。谢谢。
无法下载文件的原因是您使用的是 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 请求内重定向)。然后,此重定向将指示浏览器在经典请求中下载文件。