2015-11-28 3 views
0

Je travaille sur une application MVC4 et essaie de créer un fichier Excel en utilisant des rapports RDLC. Voici le code AJAX que j'ai écrit pour faire un appel à la méthode du contrôleur.Fichier Excel ne se télécharge pas avec AJAX dans MVC4

var actionUrl = '@Url.Action("MethodName", "ControllerName")'; 
$.ajax(actionUrl, { 
     type: 'POST', 
     data: { merchantAlias: merchantName2, merchantName: merchantName1, sDate: date1, eDate: date2, Incident: whichIncident, call: whichcall }, 
     success: function (d) { 
      alert(d); 
      alert("success1"); 
     } 
}); 

J'ai essayé de déboguer l'application et vérifié que la méthode du contrôleur est appelée correctement et qu'elle renvoie le fichier. Il affiche également le message d'alerte "succès", . Toutefois, dans la vue, le fichier n'est pas téléchargé.

J'ai essayé une chose similaire en utilisant un lien hypertexte et j'ai envoyé des paramètres codés en dur à la méthode et le fichier est téléchargé. Le code suivant est:

<div><a href="@Url.Action("MethodName", new { merchantAlias = "someAlias", merchantName = "someName", sDate = "2015-01-01 00:00:00", eDate = "2015-01-01 00:10:00", Incident = "0", call = 1 })"> Get Report Excel</a></div> 

Mais j'ai besoin de passer des paramètres dynamiques à ma méthode en fonction de la sélection faite par l'utilisateur sur la vue.

Voici le code écrit à l'intérieur du contrôleur Méthode:

 LocalReport lr = new LocalReport(); 
     lr.ReportPath = Path.Combine(Server.MapPath("~/Reports"), "MerchantExcelReport.rdlc"); 
     DataTable dt = GetDataForExcel(merchantAlias, merchantName, sDate, eDate, Incident, call); 
     ReportDataSource rd = new ReportDataSource("MerchantExcelDataSet", dt); 
     lr.DataSources.Add(rd); 
     string reportType = "Excel", mimeType, encoding, fileNameExtension; 

     string deviceInfo = 
     "<DeviceInfo>" + 
     " <OutputFormat>" + reportType + "</OutputFormat>" + 
     " <PageWidth>8.5in</PageWidth>" + 
     " <PageHeight>11in</PageHeight>" + 
     " <MarginTop>0.5in</MarginTop>" + 
     " <MarginLeft>1in</MarginLeft>" + 
     " <MarginRight>1in</MarginRight>" + 
     " <MarginBottom>0.5in</MarginBottom>" + 
     "</DeviceInfo>"; 

     Warning[] warnings; 
     string[] streams; 
     byte[] renderedBytes; 

     renderedBytes = lr.Render(reportType, deviceInfo, out mimeType, out encoding, out fileNameExtension, out streams, out warnings); 
     return File(renderedBytes, mimeType); 
+0

Que voulez-vous dire par "le fichier ne se télécharge pas"? Ajax appelle les données de téléchargement à partir du serveur mais ne provoque pas l'affichage du message de téléchargement à l'utilisateur. Vous pouvez obtenir le contenu du fichier Dans la méthode de succès, je suppose. –

+0

Si c'est le cas, au lieu d'une demande de publication JSON, simuler un clic sur un lien hypertexte, –

Répondre

3

Avec ajax vous ne pouvez pas télécharger le fichier que vous pouvez utiliser

window.location = 'your url'; 

Ou utilisez peut utiliser

jQuery File Download plugin pour télécharger le fichier que vous devez faire est de retourner le chemin du fichier à partir de votre contrôleur et en cas de succès de l'appel ajax

var actionUrl = '@Url.Action("MethodName", "ControllerName")'; 
$.ajax(actionUrl, { 
     type: 'POST', 
     data: { merchantAlias: merchantName2, merchantName: merchantName1, sDate: date1, eDate: date2, Incident: whichIncident, call: whichcall }, 
     success: function (d) { 

      $.fileDownload(yourfilepath); 
     } 
}); 
+0

J'ai fait usage de window.location –

0

Vous ne pouvez pas demander au navigateur de télécharger le fichier avec ajax. Vous devez stocker votre fichier sur votre serveur et ensuite définir window.location avec le chemin du fichier.

Ou si vous voulez utiliser le flux au lieu de stocker le fichier, il suffit de mettre l'URL de votre code qui renvoie le fichier plutôt toute requête ajax avec vos paramètres de chaîne de requête.