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

时间:2012-12-30 02:20:16

标签: c# ajax asp.net-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 = doQueryWith(startDate);

   // Create file based on results
   ....
   // How do I tell the server to make this a file download??
 }

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

<a h r e f="mycontroller/getfile/1"/>Download</a>

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

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

示例:

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

假设日期是12-25-2012

这会产生吗

mycontroller/GetFile/12/25/2012
MVC会将此视为三个参数吗?

4 个答案:

答案 0 :(得分:11)

我最终做的是从我的javascript调用我的控制器:

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

window.location = url;

mycontroller.cs

 public void GetFile(DateTime startDate) 
{

}

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

答案 1 :(得分:3)

您可以使用控制器类的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方法的所有overloads并使用适当的方法。

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

答案 2 :(得分:3)

使用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

希望这能帮到你......

答案 3 :(得分:1)

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

请参阅以下链接:

Handling an ASP.NET MVC FileResult returned in an (jQuery) Ajax call

File download in Asp.Net MVC 2

我希望这会有所帮助。