为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C#
一只萌萌小番薯 2022-07-23 17:05:16
我正在尝试使用 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 不能为空。参数名称:上下文我究竟做错了什么?
查看完整描述

1 回答

?
慕姐8265434

TA贡献1813条经验 获得超2个赞

一种选择是将调用移动到BuildFile控制器的操作方法中,其中控制器上下文可用作名为的属性ControllerContext。


如果您需要像示例中那样手动创建控制器,则必须自己创建上下文。Derek Comartin 在他的博文中展示了在控制台应用程序中使用 Razor(在 ASP.NET Core MVC 之外)如何为 ASP.Core 2 项目执行此操作。对于您的情况,请尝试更改


pdfBytes = actionPDF.BuildFile(controller.ControllerContext);


pdfBytes = actionPDF.BuildFile(CreateDummyControllerContext("SiteSuperReports"));

使用以下方法:


    private ControllerContext CreateDummyControllerContext(string controllerName)

    {

        var context = new ControllerContext

        {

            HttpContext = new DefaultHttpContext

            {

                RequestServices = GetServiceProvider()

            },

            RouteData = new RouteData

            {

                Values = {{"controller", controllerName}}

            },

            ActionDescriptor = new Microsoft.AspNetCore.Mvc.Controllers.ControllerActionDescriptor

            {

                RouteValues = new Dictionary<string, string>(),

            }

        };


        return context;

    }


    // see https://codeopinion.com/using-razor-in-a-console-application/

    private ServiceProvider GetServiceProvider()

    {

        var services = new ServiceCollection();

        services.AddSingleton(PlatformServices.Default.Application);

        var environment = new HostingEnvironment

        {

            ApplicationName = Assembly.GetEntryAssembly().GetName().Name

        };

        services.AddSingleton<IHostingEnvironment>(environment);

        services.Configure<RazorViewEngineOptions>(options =>

        {

            options.FileProviders.Clear();

            options.FileProviders.Add(new PhysicalFileProvider(Directory.GetCurrentDirectory()));

        });

        services.AddSingleton<ObjectPoolProvider, DefaultObjectPoolProvider>();

        services.AddSingleton<DiagnosticSource>(new DiagnosticListener("Microsoft.AspNetCore"));


        services.AddLogging();

        services.AddMvc();


        return services.BuildServiceProvider();

    }

您可能需要添加 Microsoft.Extensions.PlatformAbstractions 包。


查看完整回答
反对 回复 2022-07-23
  • 1 回答
  • 0 关注
  • 156 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号