我正在从表单发布事件触发的操作返回File结果。 我无法获得下载对话框。相反,如果我使用:
return File(Encoding.UTF8.GetBytes(reportPath), "text/plain", "Report.csv");
我在目标div中执行ajax后得到文件的路径。
当我使用
时return File(reportPath, "text/plain", "Report.csv");
我在目标div中获取该文件的内容。
该行动被宣布为
[HttpPost]
public virtual ActionResult ExportFilter(Model model) {
string outputFile = CreateReport(model);
return File(....)
}
表单通过Ajax.BeginForm(...)提交。
修改
更多信息:我的表单有2个提交按钮。一个用于在目标div中显示结果,另一个用于导出结果。该动作是相同的,我使用它来确定触发事件的按钮:
[HttpPost]
public virtual ActionResult Run( model )
{
var bExecute = !string.IsNullOrEmpty(Request.Form["execute"]);
return bExecute ? Execute(model) : Export(model);
}
[HttpPost]
public virtual ActionResult Execute( model )
{
....
return PartialView("Report", model);
}
[HttpPost]
public virtual FileResult Export( model ) {
.....
return File(....)
}
在一些答案之后,我尝试使用以下方式重定向到获取操作:
....
return RedirectToAction( MVC.Report.OfferDownload(ReportFile) );
}
[HttpGet]
public virtual FileResult OfferDownload(string FileName)
{
return File(FileName, "text/csv", "Report.csv");
}
然而,这没有帮助。
我也试过Stream文件,但也没有用。
EDIT2
当我用Html.BeginForm替换Ajax.BeginForm时,绝对是Ajax问题。我想到的一个解决方案是在提交按钮上使用onclick事件来更改表单属性。
答案 0 :(得分:1)
打开位于服务器上提供的路径上的文件并读取其内容。将内容作为FileResult发送。另外,如果您希望下载,请不要通过AJAX提交表单。响应将被发送到AJAX代码,我认为浏览器不会拦截它并给你一个文件下载对话框。这实际上可能是整个问题(在这种情况下,您的第二个样本可能有效)。
string outputFile = CreateReport(model);
using (var stream = new StreamReader( outputFile ))
{
return File( stream, "text/csv", "Report.csv" );
}
编辑:FWIW,我会将“text / csv”或“application / csv”用于CSV文件。
答案 1 :(得分:0)
对于遇到此问题的新用户:在POST方法中重定向到GET无法正常工作。您可以保留Ajax POST,并且在成功之后,您可以通过FileResult GET操作方法执行GET以提供下载文件。
$.ajax({
url: '@Url.Action("ExportFilter")',
type: 'POST',
cache: false,
async: true,
success: function (data) {
window.location.replace(urlOfferDownload + "?FileName=" + data.FileName);
}
});