2012-03-27 61 views
9

我有一個ajax請求到我的服務器,我正在創建一個PDF文件。現在我想在新的窗口/標籤中顯示這個文件,或者只是下載它。我怎樣才能做到這一點?在ajax請求中返回PDF

我的要求

$.ajax({ 
    url: '/Document/CreatePDF', 
    type: 'POST', 
    data: { 
     docid: documentId, 
     dataId: array 
    }, 
    traditional: true, 
    success: function (data) { 
    } 
}); 

    [HttpPost] 
    public FileStreamResult CreatePDF(long docid, List<long> dataId) 
    { 
     var document = _rep.LoadDocument(docid.ToString(), Server.MapPath("~/Documents/") + docid + ".xml"); 

     var exporter = new PDFExporter(document); 

     MemoryStream fileStream = exporter.CreatePDF(); 
     byte[] PdfByte = fileStream.GetBuffer(); 
     fileStream.Flush(); 
     fileStream.Close(); 

     HttpContext.Response.AddHeader("content-disposition","attachment; filename=form.pdf"); 

     return new FileStreamResult(fileStream, "application/pdf"); 
    } 
+0

我覺得你應該或者發送一個正常的形式向服務器或地址返回給創建的PDF文檔,其中的JavaScript可以在瀏覽器中的一個新窗口... – 2012-03-27 21:21:32

+0

通用的解決方案轉發到:這爲我工作(PDF從通過MVC的AJAX調用一個字節[]模態對話框) kamgman 2017-06-19 20:07:48

回答

12

不能使用AJAX來下載文件。原因是因爲JavaScript不允許您在客戶端計算機上保存下載的內容,也不提示您另存爲對話框。如果你需要傳遞參數給那些你可以訂閱.submit活動這種形式,然後在客戶端只知道這個控制器的動作動態地注入隱藏

@using (Html.BeginForm("CreatePDF", "Document", FormMethod.Post, new { id = "myform" })) 
{ 
    <button type="submit">Download</button> 
} 

:你應該用一個簡單的HTML <form>或錨使用相應的值將其輸入到它中,然後保留默認操作執行。如果這些值在服務器端是已知的,您應該簡單地使用HTML助手來生成這些隱藏的字段。

+0

@Derin Dimitrov的使用錨的任何好的例子?? – 2014-09-03 18:29:29