#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.