【问题标题】:How to implement file download with AJAX and MVC如何使用 AJAX 和 MVC 实现文件下载
【发布时间】:2012-12-30 02:20:15
【问题描述】:

我想通过在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 将参数传递给 MVC 控制器的首选方法是什么?

例子:

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

假设日期是 12-25-2012

这会产生吗

mycontroller/GetFile/12/25/2012

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

【问题讨论】:

  • 您的问题的答案可以在 [this][1] 链接中找到。 [1]:stackoverflow.com/questions/5826649/…
  • 除非您需要一个“可破解”的 URL,否则我不确定您是否需要这样做。只需将日期作为参数传递给控制器​​方法,然后使用建议的 FileResult 实现。您可能使这变得比需要的更难?

标签: c# ajax asp.net-mvc


【解决方案1】:

我最终做的是从我的 javascript 中调用我的控制器,例如:

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

window.location = url;

mycontroller.cs

 public void GetFile(DateTime startDate) 
{

}

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

【讨论】:

  • 还有一点评论,尽管世界各地的日期不同,但现在各地都非常接受使用 ISO-8601 代替任何其他格式。不幸的是,MVC 以一种奇怪的方式包装日期,而且它并不是最流行的。我建议您始终使用 ISO-8601,因为您将来可以更轻松地更改控制器。
  • 这非常适用于下载 jQuery Ajax 调用不支持的文件。感谢您提供这个简洁而优雅的解决方案!
【解决方案2】:

您可以使用控制器类的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 请求。

【讨论】:

    【解决方案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

    希望对您有所帮助...

    【讨论】:

      【解决方案4】:

      您的控制器操作方法应返回 FileResult 而不是 void。并且没有必要通过 AJAX 执行此操作 - 事实上,您不想使用 AJAX 执行此操作。您将需要涉及的浏览器,以便它知道为用户提供下载对话框。

      查看以下链接:

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

      File download in Asp.Net MVC 2

      我希望这会有所帮助。

      【讨论】:

      • 我真的很纠结如何将参数传递给 MVC 控制器。或者最好的方法是什么。
      • Romias 下面的回答显示了如何使用 ActionLink 将值传递给您的操作方法。
      猜你喜欢
      • 2014-12-30
      • 2023-04-07
      • 2018-02-21
      • 2015-05-29
      • 2010-11-22
      • 2019-09-28
      • 1970-01-01
      • 2011-10-07
      • 1970-01-01
      相关资源
      最近更新 更多