从 Ajax 调用控制器操作时无法下载生成的 PDF [重复]
Posted
技术标签:
【中文标题】从 Ajax 调用控制器操作时无法下载生成的 PDF [重复]【英文标题】:Unable to download generated PDF when controller action is called from Ajax [duplicate] 【发布时间】:2019-04-19 16:43:47 【问题描述】:我正在从控制器返回 FilestreamResult 我尝试了 jquery 和 ajax 两种方式,但无法成功从控制器下载 pdf/xlsx 文件。
控制器:
var filestream = new FileStream(pdfoutputpath + ".pdf", FileMode.Open);
return new FileStreamResult(filestream, "application/pdf");
使用jquery查看代码:
function downloadpdffile(id)
$(".popup-overlay, .popup-content").removeClass("active");
var url = "/WorkInstructions/WorkinstructionDownload";
$.get(url, id: id, fileformat: 2 , function ()
);
使用 ajax:
function downloadpdffile(id)
$(".popup-overlay, .popup-content").removeClass("active");
$.ajax(
url: "/WorkInstructions/WorkinstructionDownload",
cache: false,
type: "GET",
data: id: id, fileformat: 2 ,
contentType: 'application/json; charset=utf-8',
dataType: 'json',
success: function ()
);
【问题讨论】:
如果将 ajax 更改为POST
会发生什么?另外,您的控制器方法是如何装饰的? HttpGet, HttpPost
等。调用时你的控制器方法是否被命中?将错误回调添加到您的 ajax 请求中,并在成功和错误回调函数的主体中放置一些内容,然后查看命中的是哪一个,如果命中错误,您可以从 XHR 对象中获取一些信息。
你能展示你完整的控制器代码吗?
是否有必要使用 ajax 或者您只想下载该 pdf。还是 xls 文件?
如果您需要通过ajax
接收文件,我会参考这篇 SO 帖子 (***.com/questions/4545311/…)
【参考方案1】:
如果您的控制器没有问题,您可以使用 window.open 函数来完成您的任务。我在我的项目中使用了相同的技术。
var downloadURL='@Url.Action("WorkinstructionDownload", "WorkInstructions", new id = id, fileformat = 2)'
window.open(downloadURL)
【讨论】:
【参考方案2】:尝试将其放入您的 ajax 调用的 success
函数中:
success: function()
window.location = '@Url.Action("WorkinstructionDownload", "WorkInstructions", new id = id, fileformat = 2)';
虽然我不认为 ajax 在这里提供任何价值,除非我遗漏了什么。您可以轻松获取我在上面发布的 success
函数的内容,并将其完全放在 ajax 调用之外(并删除 ajax 调用)。或者您可以简单地执行以下操作并完全删除脚本:
<a href="@Url.Action("WorkinstructionDownload", "WorkInstructions", new id = id, fileformat = 2 )">Download Form</a>
【讨论】:
好吧,感谢你的工作,但我试过它不起作用。 我已经将我列出的两个选项的用例放在一起,它们不使用 ajax 并且它们正在工作。你能提供更多关于出了什么问题的信息吗?您是否收到错误消息?如果这不起作用,我怀疑您的控制器操作有问题。在这种情况下,您需要将整个控制器操作发布到您的问题中 现在我找到了另一个解决方案并且它正在工作,我自定义创建ancor标签 并从js调用并根据需要工作。以上是关于从 Ajax 调用控制器操作时无法下载生成的 PDF [重复]的主要内容,如果未能解决你的问题,请参考以下文章