我正在尝试将用户控件的输出转换为字符串,以便通过电子邮件发送。如果我从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);
有什么方法可以完成这项工作,或者有其他/更好的方法来获取指定页面的输出并向其发送电子邮件?
我做了类似的事情,它确实起作用。我有一个计划任务在后台运行,每周生成一些客户报告,我需要填充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投射到页面中而没有那个东西。否则,您可以使用类似于我的代码的方式来设置控件,以确保控件设置正确。