如何从后台作业将用户控件的输出呈现为字符串

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

我正在尝试将用户控件的输出转换为字符串,以便通过电子邮件发送。如果我从ASP.Net页面调用它,它将起作用,但是当通过HangFire从后台作业调用时,它将不起作用。这是被调用的函数:

public static string EmailReport(string strControl)
{            
    UserControl userControl = (UserControl)((Page)HttpContext.Current.Handler).LoadControl(strControl);            
    string smtpBody = userControl.RenderHtml().ToString();
}

public static class UserControlExtensions
{
    public static string RenderHtml(this UserControl control)       
    {
        using (var sw = new StringWriter())
        {
            var page = new Page();
            page.Controls.Add(control);
            HttpContext.Current.Server.Execute(page, sw, false);
            return sw.ToString();
        }
    }
}

如果我从.aspx页面后面的代码中调用EmailReport,则可以正常工作。但是,当通过hangfire / startup.cs从后台作业调用它时,我得到

对象引用未设置为对象的实例。

在此行:

UserControl userControl = (UserControl)((Page)HttpContext.Current.Handler).LoadControl(strControl);  

有什么方法可以完成这项工作,或者有其他/更好的方法来获取指定页面的输出并向其发送电子邮件?

c# asp.net hangfire
1个回答
0
投票

我做了类似的事情,它确实起作用。我有一个计划任务在后台运行,每周生成一些客户报告,我需要填充html字符串,然后将其转换为pdf文件。下面是使用自定义用户控件从我的项目中生成html的代码

        var p = new Page();
        var control = (ClientReportPdfControl)p.LoadControl("~/mycontrolpath.ascx");

        control.ClientReportMeta = ClientReportMeta;//my user control custom property
        control.Report = CustomerReport;//my user control custom propert
        control.SetupControls();// my user control custom method, setup control e.g. repeater databind etc
        p.Controls.Add(control);
        StringBuilder myStringBuilder = new StringBuilder();
        TextWriter myTextWriter = new StringWriter(myStringBuilder);
        HtmlTextWriter myWriter = new HtmlTextWriter(myTextWriter);
        if (control != null && myWriter != null)
            control.RenderControl(myWriter);
        string html = myTextWriter.ToString();

为了呈现用户控件,它确实需要正常的网页中的某些内容(因为已经有一段时间了,所以不记得它是什么了),这是我的错误,因为您只是将hanlder投射到页面中而没有那个东西。否则,您可以使用类似于我的代码的方式来设置控件,以确保控件设置正确。

© www.soinside.com 2019 - 2024. All rights reserved.