在ajax请求中返回PDF

时间:2012-03-27 21:02:18

标签: asp.net-mvc pdf jquery response

我的服务器有一个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");
    }

1 个答案:

答案 0 :(得分:12)

您无法使用AJAX下载文件。原因是因为javascript不允许您将下载的内容保存在客户端计算机上,也不允许您提示“另存为”对话框。您应该使用简单的HTML <form>或锚点:

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

如果您需要将参数传递给仅在客户端知道的此控制器操作,您可以订阅此表单的.submit事件,然后使用相应的值动态地将隐藏字段注入其中,然后保留默认动作执行。如果在服务器端知道这些值,您应该只使用HTML帮助程序来生成这些隐藏字段。