2010-03-22 66 views
1

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

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(...)submited

动作声明。更

编辑

有点信息:我的形式有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(....) 
     } 

一些答案后,我试图使用重定向到获取行动:

.... 
    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它的工作原理。我想到的一个解决方案是使用提交按钮上的onclick事件来更改表单属性。

+0

我认为主要问题是AJAX提交 - 请参阅我的更新答案。 – tvanfosson 2010-03-22 19:26:46

+0

您应该在POST请求后重定向用户,并让该方法提供该文件。邮政/重定向/获取。您还应该明确地将您的操作方法的返回类型设置为FileResult。 – 2010-03-22 19:36:07

+0

我确实尝试过,看我的编辑。 – majkinetor 2010-03-23 10:50:19

回答

1

打开位于服务器上提供的路径上的文件并读取其内容。以FileResult的形式发送内容。另外,如果您期待下载,请勿通过AJAX提交表单。该响应将发送到AJAX代码,我不认为浏览器会拦截它并给你一个文件下载对话框。这实际上可能是整个问题(在这种情况下,你的第二个样本可能会工作)。

string outputFile = CreateReport(model); 
using (var stream = new StreamReader(outputFile)) 
{ 
    return File(stream, "text/csv", "Report.csv"); 
} 

编辑:FWIW,我会使用 “文本/ CSV” 或 “应用程序/ CSV” 为CSV文件。

+0

不通过Ajax提交表单不适合我。你看,形式布置在这样的方式,它有2个提交按钮 - 通过AJAX 1显示的结果目标DIV,并导致另外一个出口 – majkinetor 2010-03-23 10:49:58

+0

什么,我可能会做的是有出口按钮做一个单击处理正常提交(非AJAX),另一个按钮做一个AJAX提交。我甚至可能会为出口单独采取行动。事实上,当我这样做时,我通常会有一个操作来处​​理任何过滤器参数并将过滤器参数存储在会话中。这就是过滤器上的“表单” - 它通过AJAX发布并更新显示。导出成为此时的简单链接,并使用过滤器参数(或默认值)来获取适当的数据并将其作为文件发送出去。 – tvanfosson 2010-03-23 11:17:37

+0

谢谢。这看起来是一个很好的方法。 – majkinetor 2010-03-23 11:44:12

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