Использование 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.