Téléchargement d’un fichier sur un client dans l’application ASP.NET MVC à l’aide de JQuery

J’ai un contrôleur ASP.NET MVC avec une méthode qui doit servir un fichier au client (navigateur). L’action du contrôleur est appelée avec un appel JQuery $ .ajax. L’utilisateur doit être invité à télécharger le fichier une fois l’action du contrôleur terminée.

J’ai utilisé Response.Transmitfile / Response.WriteFile dans la méthode du contrôleur, mais les deux ne m’ont pas invité à télécharger le fichier dans le navigateur IE, même si le fichier a été créé et que j’utilise également le bon chemin.

Lorsque j’appelle la même méthode directement en tapant l’URL du contrôleur dans le navigateur, je suis immédiatement invité à télécharger le fichier créé.

Quelqu’un pourrait-il me faire savoir s’il manque quelque chose dans ce stream?

Je suppose que c’est ainsi que j’appelle l’action du contrôleur dans JQuery. Comment utiliser la réponse de l’appel JQuery Ajax pour s’assurer que le client est invité à télécharger le fichier ?

[AcceptVerbs(HttpVerbs.Post)] public ActionResult CreatePresentation(ssortingng id) { //do something here , create the file and place in a location on the server itself ssortingng filename = Path.GetFileName(filePath); Response.ContentType = "APPLICATION/OCTET-STREAM"; System.Ssortingng disHeader = "Attachment; Filename=\"" + filename + "\""; Response.AppendHeader("Content-Disposition", disHeader); FileInfo fileToDownload = new FileInfo(filePath); Response.WriteFile(fileToDownload.FullName); } 

Voici comment j’appelle l’action du contrôleur sur le côté Javascript

 function CreatePresentation() { // something here $.ajax({ type: "POST", url: "http://localhost:4844/ActionBar/CreatePresentation", data:data }); } // end of function 

Lorsque vous utilisez $.ajax ou n’importe quel autre mécanisme AJAX, vous $.ajax pipeline de transfert de fichiers normal du navigateur. C’est le pipeline principal qui déclenche la boîte de dialog Enregistrer ce fichier du navigateur, pas celui AJAX.

Pour obtenir ce que vous voulez, vous voudrez utiliser un changement d’emplacement synchrone plutôt que asynchrone: plutôt que d’utiliser $.ajax , définissez simplement document.location :

 function CreatePresentation() { //snip code that creates a map called "data" var paramSnippets = []; for (item in data) { paramSnippets.push(item + "="+data[item]); } document.location = "http://localhost:4844/ActionBar/CreatePresentation" + "?" + paramSnippets.join("&"); } 

édité en réponse aux commentaires: exemple inclus