Как отобразить вывод пользовательского элемента управления в строку из фонового задания - PullRequest
0 голосов
/ 30 октября 2019

Я пытаюсь получить вывод из пользовательского элемента управления в строку, чтобы отправить его по электронной почте. Он работает, если я вызываю его со страницы 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();
        }
    }
}

Если я вызываю EmailReport из кода за страницей .aspx, она работает нормально. Однако при вызове его из фонового задания через hangfire / startup.cs я получаю

Ссылка на объект не установлена ​​на экземпляр объекта.

в этой строке:

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

Есть ли способ заставить это работать или есть другой / лучший подход к получению вывода указанной страницы и отправке ей электронного письма?

Ответы [ 2 ]

0 голосов
/ 04 ноября 2019

Я закончил тем, что создал страницу, которая будет загружать указанный элемент управления и отправлять его по электронной почте. Я вызываю эту страницу из HangFire, используя Webclient. Уродливый обходной путь, но он работает.

0 голосов
/ 30 октября 2019

Я сделал похожую вещь, и она работает. У меня есть задание по расписанию, работающее в фоновом режиме для еженедельного генерирования клиентского отчета, мне нужно заполнить строку 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();

Чтобы отобразить пользовательский элемент управления, требуется что-то на обычной веб-странице (не могу вспомнить, что это такое, как есть)Прошло довольно много времени), ваша ошибка моя, потому что вы просто бросили своего помощника на страницу, чтобы он не имел этой вещи. В противном случае у вас может быть что-то похожее на мой код для настройки вашего элемента управления, чтобы убедиться в правильности настройки элемента управления

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...