Rotativa 值不能为空。参数名称:上下文

我正在尝试使用 Rotativa 生成 PDF 并返回字节,但是出现错误:


值不能为空。参数名称:上下文


这是我的代码:


public string getReportsPDF(string community, string procedure)

{

    SiteSuperReportsController controller = new SiteSuperReportsController();


    string value = "";

    byte[] pdfBytes = new byte[] { };


    if (procedure == "GetProductionTasks")

    {

        var actionPDF = new Rotativa.ActionAsPdf("RedBluePDF", new { community = community, procedure = procedure })

        {

            PageSize = Size.A4,

            PageOrientation = Rotativa.Options.Orientation.Landscape,

            PageMargins = { Left = 1, Right = 1 }

        };

        try

        {

            pdfBytes = actionPDF.BuildFile(controller.ControllerContext);

            value = "Works";

        }

        catch(Exception e)

        {

            value = e.Message.ToString();

        }

    }

    return value;

}

返回的值为 Value 不能为空。参数名称:上下文


我究竟做错了什么?


一只萌萌小番薯
浏览 157回答 1
1回答

慕姐8265434

一种选择是将调用移动到BuildFile控制器的操作方法中,其中控制器上下文可用作名为的属性ControllerContext。如果您需要像示例中那样手动创建控制器,则必须自己创建上下文。Derek Comartin 在他的博文中展示了在控制台应用程序中使用 Razor(在 ASP.NET Core MVC 之外)如何为 ASP.Core 2 项目执行此操作。对于您的情况,请尝试更改pdfBytes = actionPDF.BuildFile(controller.ControllerContext);至pdfBytes = actionPDF.BuildFile(CreateDummyControllerContext("SiteSuperReports"));使用以下方法:&nbsp; &nbsp; private ControllerContext CreateDummyControllerContext(string controllerName)&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; var context = new ControllerContext&nbsp; &nbsp; &nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; HttpContext = new DefaultHttpContext&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; RequestServices = GetServiceProvider()&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; },&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; RouteData = new RouteData&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Values = {{"controller", controllerName}}&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; },&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ActionDescriptor = new Microsoft.AspNetCore.Mvc.Controllers.ControllerActionDescriptor&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; RouteValues = new Dictionary<string, string>(),&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; };&nbsp; &nbsp; &nbsp; &nbsp; return context;&nbsp; &nbsp; }&nbsp; &nbsp; // see https://codeopinion.com/using-razor-in-a-console-application/&nbsp; &nbsp; private ServiceProvider GetServiceProvider()&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; var services = new ServiceCollection();&nbsp; &nbsp; &nbsp; &nbsp; services.AddSingleton(PlatformServices.Default.Application);&nbsp; &nbsp; &nbsp; &nbsp; var environment = new HostingEnvironment&nbsp; &nbsp; &nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ApplicationName = Assembly.GetEntryAssembly().GetName().Name&nbsp; &nbsp; &nbsp; &nbsp; };&nbsp; &nbsp; &nbsp; &nbsp; services.AddSingleton<IHostingEnvironment>(environment);&nbsp; &nbsp; &nbsp; &nbsp; services.Configure<RazorViewEngineOptions>(options =>&nbsp; &nbsp; &nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; options.FileProviders.Clear();&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; options.FileProviders.Add(new PhysicalFileProvider(Directory.GetCurrentDirectory()));&nbsp; &nbsp; &nbsp; &nbsp; });&nbsp; &nbsp; &nbsp; &nbsp; services.AddSingleton<ObjectPoolProvider, DefaultObjectPoolProvider>();&nbsp; &nbsp; &nbsp; &nbsp; services.AddSingleton<DiagnosticSource>(new DiagnosticListener("Microsoft.AspNetCore"));&nbsp; &nbsp; &nbsp; &nbsp; services.AddLogging();&nbsp; &nbsp; &nbsp; &nbsp; services.AddMvc();&nbsp; &nbsp; &nbsp; &nbsp; return services.BuildServiceProvider();&nbsp; &nbsp; }您可能需要添加 Microsoft.Extensions.PlatformAbstractions 包。
打开App,查看更多内容
随时随地看视频慕课网APP