尝试使用rotativa

时间:2019-06-26 17:22:13

标签: asp.net-mvc pdf rotativa

因此,我有一个使用多个视图构建pdf的控制器,每个视图都构建pdf的特定部分。

我正在传递pdfdata,它是一个json字符串,其中包含视图所需的所有数据,像这样

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结果调用razor视图,该视图由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。

谢谢

0 个答案:

没有答案