如何在表单帖子上打开生成的pdf?

时间:2011-06-01 14:42:06

标签: jquery asp.net-mvc

我希望用户提交表单并获取pdf。就像你刚刚按下PDF链接一样 在生成pdf之前,我将经历几个步骤。

首先我用JQuery打断一个表单帖子:

$("#reportForm").submit(function (event) {
            event.preventDefault();
            $.post("/Registry/Persons/Report", $(this).serialize(),
            function (data) {
                // Return the generated pdf to the browser here
            });
        });  

表单将发布到名为Report的函数中,该函数采用formcollection:

[HttpPost]
    public ActionResult Report(FormCollection collection)
    {
        // Convert keys to list of int
        var ids = collection.AllKeys.ToList().Select(s => int.Parse(s)).ToList();

        List<Person> list = new List<Person>(repository.GetPersons(ids));
        return GeneratePdf(list);
    }  

此函数调用pdf生成器,该生成器将pdf作为MemoryStream返回。

public FileResult GeneratePdf(List<Person> list)
    {
        // Display the document
        MemoryStream stream = new MemoryStream();
        document.Save(stream, false);

        return File(stream.ToArray(), "application/pdf", "Resultatfil");
    }

如果我将数据变量打印到div中,我会得到一堆奇怪的字符(我认为是生成的pdf)。但是如何将pdf发送到浏览器以便我得到“打开/保存”文件对话框?

1 个答案:

答案 0 :(得分:2)

不要使用AJAX下载文件。你不能用AJAX做到这一点。在您的ajax调用的成功回调中,您将获得代表PDF文件的控制器操作的结果,但显然您不能完全不做任何事情,因为安全原因javascript禁止您写入客户端计算机。所以只需使用普通表单提交。

基本上你会删除你的javascript并保持表格正常提交。如果您希望提示用户下载文件,只需在控制器操作中应用相应的Content-Disposition HTTP标头:

public FileResult GeneratePdf(List<Person> list)
{
    // Display the document
    MemoryStream stream = new MemoryStream();
    document.Save(stream, false);
    Response.AppendHeader("Content-Disposition", "attachment; filename=report.pdf");
    return File(stream.ToArray(), "application/pdf", "Resultatfil");
}