没有FileResult的下载对话框

时间:2010-03-22 19:14:55

标签: .net asp.net-mvc

我正在从表单发布事件触发的操作返回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事件来更改表单属性。

2 个答案:

答案 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);
    }
});