2012-03-09 111 views
0

在我心中的代碼這兩位應該工作一樣:

window.location = "../PlanView/ExportAsPDF"; 

$.ajax({ 
    url: '../PlanView/ExportAsPDF', 
    data: { }, 
    success: function (stream) { window.location = stream; } 
}); 

代碼的前位觸發用戶.PDF文件下載。第二個不 - 我的瀏覽器網絡流量有一個奇怪的請求。

有人可以突出顯示我應該注意的關鍵區別嗎?

更深入的解釋:

我需要更多的數據傳遞到我的服務器比允許的URL。因此,我需要發送到服務器而不是GET。我不能使用以前的代碼,因爲我無法將這麼多信息推送到URL中 - 服務器將以414響應。

我想用後者複製前一位代碼的功能。因爲第一個告訴瀏覽器中顯示的文件,第二個不

public ActionResult ExportAsPDF(string dataURL) 
{ 
    Document document = new Document(PageSize.A4.Rotate(), 15, 15, 30, 65); 

    byte[] buffer = new byte[0]; 
    using (MemoryStream memoryStream = new MemoryStream()) 
    { 
     PdfWriter.GetInstance(document, memoryStream); 

     document.Open(); 
     document.Add(new Paragraph("First PDF file")); 
     document.Close(); 
     buffer = memoryStream.ToArray(); 
    } 

    return File(buffer, "application/pdf", "PlanView.pdf"); 
} 

回答

1

第一個是從所述第二不同。只是因爲「流」不會是「../PlanView/ExportAsPDF」。

此外,如果您只是想將瀏覽器指向該文件,則不需要此ajax請求。還有後者,如果它在所有的作品,會給你什麼 - PDF文件的二進制內容?坦率地說,我不知道如何處理:)

如果你希望返回JSON(當然你不會得到),你應該在你的ajax屬性中有「dataType」而不是「datatype」。

UPDATE:

即使這應該工作:

$.ajax({ 
url: '../PlanView/ExportAsPDF', 
method : 'POST', 
data: { }, 
dataType: 'json', 
success: function (stream) { window.location = '../PlanView/ExportAsPDF'; } 
}); 
+0

好了,我怎麼告訴瀏覽器中顯示的文件?在我的實際實現中,我使用POST而不是GET - 所以我必須使用後面的代碼而不是前者。然而,當使用後者時,我的下載不會觸發 - 只有前者。 – 2012-03-09 00:55:52

+0

瀏覽器需要一個URL來顯示文件。現在,如何在該URL下服務該文件是另一回事......您既可以擁有一個普通文件,也可以通過一些後臺代碼(用PHP,Python或其他語言編寫)來發送內容,而這些內容似乎都是您想要做的。當然,後者(ajax請求)將不起作用,除非你找回的是該文件的URL。然後你可以做你正在做的事情,即window.location = URL。因此,例如,使您的POST請求,並讓它返回的文件的URL,然後直接瀏覽器到該URL ... – kgr 2012-03-09 00:59:04

+0

好吧,所以指你的更新,什麼是「流」變量的內容,即你的服務器是什麼返回? – kgr 2012-03-09 01:01:41