代码之家  ›  专栏  ›  技术社区  ›  majkinetor

没有文件结果的下载对话框

  •  1
  • majkinetor  · 技术社区  · 14 年前

    我正在返回由表单发布事件触发的操作的文件结果。 我无法获取下载对话框。相反,如果我使用:

    return File(Encoding.UTF8.GetBytes(reportPath), "text/plain", "Report.csv");
    

    我在目标分区中执行Ajax时获取文件的路径。

    当我使用

    return File(reportPath, "text/plain", "Report.csv");
    

    我在目标分区中获取文件的内容。

    该行动被宣布为

       [HttpPost]
       public virtual ActionResult ExportFilter(Model model) {
          string outputFile = CreateReport(model);
          return File(....)
       }
    

    表单是通过ajax.begininform(…)提交的。

    编辑

    更多信息:我的表单有两个提交按钮。一个用于在目标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(....)
           }
    

    在回答了一些问题后,我尝试重新定向以获得操作,方法是:

       ....
        return RedirectToAction( MVC.Report.OfferDownload(ReportFile) );
    }
    
        [HttpGet]
        public virtual FileResult OfferDownload(string FileName)
        {
            return File(FileName, "text/csv", "Report.csv");
        }
    

    但是,这没有帮助。

    我还尝试流式传输文件,但也没用。

    编辑2

    当然是Ajax问题,因为当我用html.begingum替换ajax.begingum时,它会起作用。我想到的一个解决方案是在提交按钮上使用onclick事件来更改表单属性。

    2 回复  |  直到 9 年前
        1
  •  1
  •   tvanfosson    14 年前

    打开位于服务器上提供的路径处的文件并读取其内容。将内容作为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文件。

        2
  •  0
  •   jaykay    9 年前

    对于任何遇到这个问题的新用户:重定向到getinthepost方法都不起作用。您可以保留您的Ajax日志,一旦成功,您可以从一个fileResult获取操作方法下载一个get-to-service文件。

    $.ajax({
        url: '@Url.Action("ExportFilter")',
        type: 'POST',
        cache: false,
        async: true,
        success: function (data) {
                window.location.replace(urlOfferDownload + "?FileName=" + data.FileName);
        }
    });