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.