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

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

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

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 внутри страницы элементов управления, список никогда не будет оцениваться. Кажется, что оцениваются только встроенные кодовые блоки. Как я могу обойти это?

Ответ 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>.

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

Ответ 2

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