ASP.NET Core MVC:通过Ajax调用Rotativa并在另一个选项卡中打开

问题描述 投票:0回答:1

我正在开发一个 ASP.NET Core MVC 应用程序,我必须将一些视图迁移到 PDF。

我正在使用

Rotativa
,到目前为止效果很好。 PDF 在新选项卡中打开。我正在运行它

@Html. ActionLink("ExportRotativa", "ExportRotativa", "Controller", null, new { target = "_blank" })

控制器看起来像这样:

[HttpGet("ExportRotativa")]
public async Task<IActionResult> ExportRotativa()
{
    DbImpendingMedicareReportViewModel model = await _IfunctionsUtil.ImpendingMedicareElibigibilityReport();
    model.uIElementModel = SessionManagerUtil.GetUIElement(HttpContext.Session);
    return new ViewAsPdf("NewPdf", model);
}

我需要的是通过Ajax来调用它。我需要它是一个

POST
并将复杂的数据作为参数传递给它。出于安全原因,我还需要它具有
[ValidateAntiForgeryToken]

根据我在论坛上找到的内容,我能够做的如下。

<input type="button" hidden="hidden" id="hack" />

function Export() {
    var htmlData;
    var win;
    $.ajax(
       {
           type: "POST",
           headers: {
               "RequestVerificationToken":
                   $('input:hidden[name="__RequestVerificationToken"]').val()
           },
           url: '@Url.Action("ExportRotativa", "Controller")',
           success: function (data) {
                htmlData = data;
               $("#hack").trigger("click");
           },
           error: OnError
       });
    $("#hack").on("click", function () {
        win = window.open("", "_blank");
        win.document.body.innerHTML = htmlData;
     });
   }

问题是 PDF 显示的是象形文字,整个屏幕都坏了,而不是报告:

View of the PDF

有没有办法使用

POST
方法从 Ajax 调用 Rotativa,并在另一个选项卡中打开它?

谢谢

pdf asp.net-core-mvc rotativa
1个回答
0
投票

但我决定下载它

是的,这是一个很好的解决方案。

关于这个问题:

问题是 PDF 显示的是象形文字,整个屏幕都坏了,而不是报告

您可以返回 Base64 编码的字符串,例如:

[HttpPost("ExportRotativa")]
public string ExportRotativa()
{
    DbImpendingMedicareReportViewModel model = await _IfunctionsUtil.ImpendingMedicareElibigibilityReport();
    model.uIElementModel = SessionManagerUtil.GetUIElement(HttpContext.Session);

    var pdfResult = new ViewAsPdf("NewPdf", model);
    var pdfBytes = await pdfResult.BuildFile(ControllerContext);
    string base64EncodedPDF = System.Convert.ToBase64String(pdfByteArray);
    return base64EncodedPDF;
}

还有

$("#hack").on("click", function () {
    win = window.open("", "_blank");
    win.document.write(
        "<iframe width='100%' height='100%' src='data:application/pdf;base64,
            " + encodeURI(htmlData) + "'></iframe> "
    )
 });

请参阅此链接中的应用:https://learn.microsoft.com/en-us/answers/questions/976115/how-to-get-a-pdf-file-and-open-in-new- tab-in-asp-n

最新问题
© www.soinside.com 2019 - 2024. All rights reserved.