window.location=MVC File()和$.ajax'之间的差异;s成功(window.locat

Differences between window.location = MVC File() and $.ajax's success( window.location = result )?

本文关键字:window 之间 成功 locat ajax MVC location File      更新时间:2023-09-26

在我看来,这两位代码应该工作相同:

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

前一段代码触发用户下载.PDF文件。第二个没有——我有一个奇怪的请求挂在浏览器的网络流量中。

有人能强调一下我应该意识到的关键差异吗?

更深入的解释:

我需要向服务器传递比URL中允许的更多的数据。因此,我需要POST到服务器,而不是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");
}

第一个与第二个不同,因为第一个告诉浏览器显示文件,而第二个不显示。仅仅因为"流"不会是"../PlanView/ExportAsPDF".

此外,如果您只想将浏览器指向该文件,则不需要此ajax请求。还有后者,如果它在所有的工作,会给你什么二进制内容的PDF文件?坦率地说,我不知道如何处理:)

如果您希望得到JSON(当然不会得到),那么您的ajax属性中也应该有"dataType"而不是"dataType"。

更新:

即使这样也应该有效:

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