我希望用户提交表单并获取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发送到浏览器以便我得到“打开/保存”文件对话框?
答案 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");
}