【发布时间】:2011-01-30 12:03:40
【问题描述】:
我正在从表单发布事件触发的操作中返回文件结果。 我无法获得下载对话框。相反,如果我使用:
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 中呈现结果,另一个用于导出结果。 actton 是相同的,我用它来确定哪个按钮触发了事件:
[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(....)
}
经过一些回答后,我尝试使用以下命令重定向到 Get 操作:
....
return RedirectToAction( MVC.Report.OfferDownload(ReportFile) );
}
[HttpGet]
public virtual FileResult OfferDownload(string FileName)
{
return File(FileName, "text/csv", "Report.csv");
}
然而,这并没有帮助。
我也尝试过流式传输文件,但也没有用。
EDIT2
肯定是 Ajax 问题,因为当我将 Ajax.BeginForm 替换为 Html.BeginForm 时它会起作用。我想到的一种解决方案是在提交按钮上使用 onclick 事件来更改表单属性。
【问题讨论】:
-
我认为主要问题是 AJAX 提交 - 请参阅我更新的答案。
-
您应该在 POST 请求后重定向用户并让该方法为文件提供服务。发布/重定向/获取。您还应该明确地将您的操作方法的返回类型设为 FileResult。
标签: .net asp.net-mvc