如何使用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中下载文件
我希望这有帮助。