首页 > 解决方案 > 尝试使用 rotativa 将 json 字符串从 ActionAsPdf 传递到 ActionResult 视图

问题描述

所以我有一个控制器,它使用多个视图构建 pdf,每个视图构建 pdf 的特定部分。

我正在传递 pdfdata ,它是一个 json 字符串,其中包含视图需要的所有数据到 ActionAsPdf 中,如下所示

private byte[] CreateCertificatePart(CertificatePart part, string pdfdata)
    {
        var customSwitches = string.Format(
            "--print-media-type " +
            "--margin-top 10mm " +
            "--margin-bottom 10mm " +
            "--margin-left 10mm " +
            "--margin-right 10mm " +
            "--encoding utf-8 " +
            "--minimum-font-size 11 " +
            "--zoom 1.0 " +
            "--disable-smart-shrinking"
        );

        var viewname = part.ToString();
        var pdfResult = new ActionAsPdf(viewname,pdfdata) { CustomSwitches = customSwitches };
        var pdfBytes = pdfResult.BuildFile(ControllerContext);            

        return pdfBytes;
    }

然后 Action 结果调用由 ActionAsPdf 转换为 pdf 字节的剃刀视图。

public ActionResult CertificateBody(string pdfdata)
    {
        var data = new PdfData();

        try
        {
            data = JsonConvert.DeserializeObject<PdfData>(pdfdata);

            return View(data.PdfBodyName, data.CertModel);
        }
        catch (Exception ex)
        {
            AppInsightLog.LogError(ex, $"NewCertificateBody{data.CertModel.Schedule.QuoteReference}");
            return new HttpStatusCodeResult(400, "NewCertificateBody");
        }
    }

问题是 pdfData 始终为空!这是 CreateCertificatePart 中很长的 json 字符串。我最初尝试传递一个模型,但这也是空的,这就是为什么我试图传递一个字符串而不是认为这样就可以了。

如果我传递一个非常简单的字符串(如“hello”或整数)就可以了,所以我可以传递一个 ID,但我不想在操作结果方法中进行数据库调用.. 因为那样我会多次调用相同的调用.

CreateCertificatePart 是递归的,但所有不同的视图都需要相同的模型,即 PdfData。

谢谢

标签: asp.net-mvcpdfrotativa

解决方案


推荐阅读