Использование LoadControl на страницах с серверными элементами управления

#c# #asp.net

#c# #asp.net

Вопрос:

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

В служебном классе у меня есть метод, который содержит этот код:

 StringBuilder sb = new StringBuilder();
Page p = new Page();
UserControl ctrl = (UserControl)p.LoadControl("~/EmailTemplates/OrderConfirmation.ascx");
StringWriter sw = new StringWriter(sb);
Html32TextWriter htw = new Html32TextWriter(sw);

ctrl.RenderControl(htw);
  

Это правильно записывает текст пользовательских элементов управления, но если я хочу использовать серверный элемент управления, такой как listview внутри страницы элементов управления, listview никогда не вычисляется. Кажется, что оцениваются только блоки встроенного кода. Как я могу обойти это?

Комментарии:

1. Можете ли вы вставить какой-нибудь код, показывающий, как выглядит элемент управления? Потому что это должно работать нормально…

Ответ №1:

На самом деле вы должны добавить элемент управления на страницу и выполнить страницу:

     var page = new FormlessPage();
    var ctrl = (UserControl)page.LoadControl("~/EmailTemplates/OrderConfirmation.ascx");

    page.Controls.Add(ctl);
    StringWriter writer = new StringWriter();
    HttpContext.Current.Server.Execute(page, writer, false);
    return writer.ToString();
  

Бесформенная страница просто выглядит как:

 public class FormlessPage : Page
{
    public override void VerifyRenderingInServerForm(Control control)
    {
    }
}
  

Это позволяет вашему элементу управления иметь входные элементы без <form> оболочки.

Этот метод вызовет методы жизненного цикла вашей страницы и красиво свяжет элементы вашей формы.

Комментарии:

1. Спасибо you…So многое. Это был разочаровывающий день. Это очень интересно, что вы можете выполнить страницу таким образом.

2. @Nick: Всегда пожалуйста. Я делаю нечто подобное, где я повторно использую пользовательские элементы управления для создания отчетов HTML, переключая пользовательские элементы управления в режим «только для чтения». Я помню, как тратил часы, пытаясь создать или отследить решение. Рад, что смог помочь!

Ответ №2:

Вы могли бы использовать общедоступную функцию (она же ProcessLoad) вместо функции Page_Load и вызывать ее сразу после загрузки элемента управления. Таким образом, вы также можете передавать параметры в свой UserControl.