Comment implémenter le téléchargement de fichier avec AJAX et MVC

Je souhaite effectuer une opération de téléchargement de fichier à l’aide de l’appel jQuery AJAX avec certains parameters sous MVC

Exemple

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

En règle générale, je demande simplement à mon fichier de télécharger un lien tel que:

 Download 

mais dans le cas ci-dessus la date sera dynamic.

Si je n’utilise pas ajax, quel serait le moyen préféré de transmettre les parameters au contrôleur MVC à l’aide de javascript?

Exemple:

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

en supposant que la date est le 12-25-2012, cela produirait-il

 mycontroller/GetFile/12/25/2012 

MVC traiterait-il cela comme trois parameters?

Ce que j’ai fini par faire, c’est d’appeler mon contrôleur depuis mon javascript comme:

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

mycontroller.cs

  public void GetFile(DateTime startDate) { } 

Ma préoccupation initiale concernait les parameters de date. Je ne voulais pas avoir à l’parsingr.

Vous pouvez utiliser la méthode File de la classe controller pour renvoyer un fichier au navigateur.

L’exemple ci-dessous renvoie un fichier pdf.

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

En supposant repositary.GetFileDedetails méthode repositary.GetFileDedetails renvoie les détails du fichier à partir de l’id.

Vous pouvez également renvoyer le fichier à partir d’un emplacement physique (un chemin) ou d’un stream. Vérifiez toutes les surcharges de la méthode File et utilisez la méthode appropriée.

Cela n’a rien à voir avec l’ajax. Il s’agit d’une requête GET normale via un navigateur.

En utilisant l’assistant ActionLink, vous pouvez transmettre plusieurs parameters à votre contrôleur:

 HtmlHelper.ActionLink( ssortingng linkText, ssortingng actionName, ssortingng controllerName, object routeValues, object htmlAtsortingbutes ) 

Donc dans votre cas:

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

Avec jQuery, vous pouvez modifier la valeur de startDate dans le lien avec le contenu de votre sélecteur de date ou de votre zone de texte.

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

Ensuite, dans votre contrôleur, utilisez simplement l’une des autres réponses ici, à propos de FileResult .

J’espère que cela vous aidera …

Votre méthode d’action de contrôleur doit renvoyer un FileResult au lieu de void. Et il n’est pas nécessaire de le faire via AJAX – en fait, vous ne voulez pas le faire avec AJAX. Vous aurez besoin du navigateur impliqué pour qu’il sache fournir une boîte de dialog de téléchargement à l’utilisateur.

Voir ces liens:

Gestion d’un FileResult ASP.NET MVC renvoyé dans un appel Ajax (jQuery)

Téléchargement de fichier dans Asp.Net MVC 2

J’espère que ça aide.