【问题标题】:PDF thrown to browser console, not downloadingPDF扔到浏览器控制台,不下载
【发布时间】:2018-09-04 16:41:35
【问题描述】:

我将 Rotativa 用于generate a PDF file from a view,效果很好,但现在在浏览器上,我在控制台上收到原始文件,没有下载对话框,没有警告,什么都没有。这是我的代码:

控制器

public ActionResult DescargarPDF (int itemId) {
        var presupuesto = ReglasNegocio.Fachada.Consultas.ObtenerPresupuesto(itemId);     
        return new Rotativa.PartialViewAsPdf("_PresupuestoFinal", presupuesto) {
            FileName = "Presupuesto_" + itemId + ".pdf",
            PageSize = Rotativa.Options.Size.A4
        };
    }

jQuery 脚本:

$(".convertirPDF").on("click", function (id) {
    var itemId = $(this).data('itemid');
    Pdf(itemId);
});

function Pdf(itemid) {
    var id = itemid;

    $.ajax({
        method: "POST",
        url: 'DescargarPDF',
        data: { itemId: id },
        cache: false,
        async: true,
    });
};

HTML 上的按钮

<button class="convertirPDF btn btn-secondary btn-info" data-itemid="@item.Id">PDF</button>

我已经在控制器上尝试了几个代码(结果相同),因为脚本和视图似乎工作正常。但是,我怀疑,也许 html 或脚本需要一些调整来通知浏览器它必须下载文件?

提前感谢大家。

【问题讨论】:

  • 从操作中返回FileResult?还是使用ActionAsPdf
  • 在您的控制器中,您是否添加了System.Net.Mine.ContentDispositionInline = false
  • 啊,抱歉,刚刚注意到您通过 ajax 获取 PDF 数据。最简单的方法是通过锚点 &lt;a&gt;target="_blank" 来打开它
  • 试试这个:var contentDisposition = new System.Net.Mine.ContentDisposition { Inline = false }; response.AppendHeader("Content-Disposition", contentDisposition.ToString()); - 不确定它是否对 ajax 有帮助。它建议浏览器不应该在浏览器窗口中显示下载。所以可能不是你想要的。
  • 错字:System.Net.Mime

标签: c# jquery html asp.net-mvc rotativa


【解决方案1】:

我找到了解决方案。它并不优雅,但它确实有效。 所以我不需要使用 ajax 来发出请求,也不需要为按钮提供功能。我有点确定这个问题与 JS 和/或 jQuery 有关。不过,有一种更简单的方法可以做到这一点。

我将我的 html 按钮更改为:

<a href="DescargarPDF/?itemId=@item.Id" target="_blank" class="btn btn-secondary btn-info">PDF</a>

所以它看起来像一个按钮,但它实际上是我的控制器方法的链接。我还删除了该按钮的脚本,现在它下载了文件。不是按照预期的名称,但仍然是。

感谢大家。编码愉快。

更新

我一直在从事同一个项目,我想我找到了我的 PDF 文件被扔到控制台的原因。

问题是,jQuery 发出请求,因此 jQuery 管理响应。有那么简单吗。如果您检查 official docs 是否为 .post(),您将看到以下内容:

成功回调函数传递返回的数据,该数据将是 XML 根元素或文本字符串,具体取决于响应的 MIME 类型。它还传递了响应的文本状态。

从 jQuery 1.5 开始,成功回调函数也传递了一个“jqXHR”对象(在 jQuery 1.4 中,它传递了 XMLHttpRequest 对象)。

大多数实现都会指定一个成功处理程序。

我不是,所以默认情况下,它只是将它放到控制台。我希望这对这个问题有所帮助并有所帮助。编码愉快。

【讨论】:

    猜你喜欢
    • 2018-12-11
    • 2020-07-08
    • 2018-01-31
    • 2013-01-25
    • 2018-05-15
    • 1970-01-01
    • 2013-03-22
    • 1970-01-01
    • 2014-01-29
    相关资源
    最近更新 更多