Как реализовать загрузку файлов с помощью AJAX и MVC

Я хотел бы предоставить операцию загрузки файлов с помощью вызова jQuery AJAX с некоторыми параметрами в MVC

Пример

(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??
 }

Обычно я просто хочу, чтобы мой файл загружал ссылку, например:

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

но в случае выше дата будет динамической.

Если я не использую ajax, что было бы предпочтительным способом передать в params на MVC-контроллер с помощью javascript?

Пример:

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

при условии, что дата 12-25-2012 это произведет

mycontroller/GetFile/12/25/2012

будет ли MVC рассматривать это как три параметра?

Ответ 1

То, что я закончил, вызывает мой контроллер из моего javascript, например:

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

window.location = url;

mycontroller.cs

 public void GetFile(DateTime startDate) 
{

}

Моя первоначальная проблема заключалась в параметрах даты. Я не хотел его разбирать.

Ответ 2

Используя помощник 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

Вы можете использовать метод 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 возвращает данные файла из идентификатора.

Вы также можете вернуть файл из физического местоположения (пути) или потока. Проверьте все перегрузки метода File и используйте соответствующий.

Это не имеет никакого отношения к ajax. это обычный GET запрос через браузер.

Ответ 4

Ваш метод действия контроллера должен возвращать FileResult вместо void. И нет необходимости делать это через AJAX - на самом деле, вы не хотите делать это с AJAX. Вам понадобится браузер, поэтому он знает, как предоставить пользователю диалоговое окно загрузки.

Смотрите эти ссылки:

Обработка файла ASPR MVC FileResult, возвращаемого в вызове Ajax (jQuery)

Загрузка файла в Asp.Net MVC 2

Надеюсь, это поможет.