如何使用AJAX和MVC实现文件下载

我想通过在MVC下使用jQuery AJAX调用和一些参数来提供文件下载操作

(javascript) function DoDownload(startDate) { $.ajax({ url:"controller/GetFile/", data: {startDate:startDate} ... }); } C# Controller Code public void GetFile(string startDate) { var results = doQuearyWith(startDate); // Create file based on results .... // HOw do I tell the server to make this a file download?? } 

我通常会让我的文件下载一个链接,如:

 Download 

但在上面的情况下,日期将是动态的。

如果我不使用ajax,那么使用javascript将params传递给MVC控制器的首选方法是什么?

例:

 window.location = "mycontroller/GetFile/" + $("#fromDate").val(); 

假设日期是12-25-2012,这将产生

 mycontroller/GetFile/12/25/2012 

MVC会将此视为三个参数吗?

我最终做的是从我的JavaScript调用我的控制器,如:

 var url = "/mycontroller/GetFile?startDate=" + $("#mydate").val() + etc... window.location = url; 

mycontroller.cs

  public void GetFile(DateTime startDate) { } 

我最初关注的是日期参数。 我不想解析它。

您可以使用控制器类的File方法将文件返回给浏览器。

以下示例返回pdf文件。

 public ActionResult GetFile(int id) { var fileInfo=repositary.GetFileDedetails(id); var byteArrayOFFile=fileInfo.FileContentAsByteArray(); return File(byteArrayOFFile,"application/pdf","yourFriendlyName.pdf"); } 

假设repositary.GetFileDedetails方法从id返回文件的详细信息。

您还可以从物理位置(路径)或流返回文件。 检查File方法的所有重载并使用适当的方法。

这与ajax无关。 这是浏览器的正常GET请求。

使用ActionLink助手,您可以将多个参数传递给控制器​​:

 HtmlHelper.ActionLink( string linkText, string actionName, string controllerName, object routeValues, object htmlAttributes ) 

所以在你的情况下:

 @Html.ActionLink("Download file", "GetFile", "MyController", new { startDate = "##" }, new { id="mydownloadlink" }) 

使用jQuery,您可以使用日期选择器或文本框的内容更改链接中startDate的值。

 $("#mydownloadlink").attr("href").replace("##", $("#yourdatetexbox").val); 

然后,在你的控制器中,只需使用其中一个关于FileResult答案。

希望这能帮到你……

您的控制器操作方法应该返回FileResult而不是void。 而且没有必要通过AJAX来实现这一点 – 事实上,你不想用AJAX来做这件事。 您需要涉及的浏览器,因此它知道为用户提供下载对话框。

看到这些链接:

处理(jQuery)Ajax调用中返回的ASP.NET MVC FileResult

在Asp.Net MVC 2中下载文件

我希望这有帮助。