Семь лет спустя, но это заслуживает того, чтобы им поделиться.
Общепринятое решение - StringBuilder
в StringWriter
в HtmlWriter
в RenderControl
- хорошо. Но есть некоторые ошибки, с которыми я, к сожалению, столкнулся, пытаясь сделать то же самое. Некоторые элементы управления будут выдавать ошибки, если они не находятся внутри Page
, а некоторые выдают ошибки, если они не находятся внутри <form>
с runat="server"
. Элемент управления ScriptManager демонстрирует оба эти поведения.
В конце концов я нашел здесь обходной путь. Суть его заключается в том, чтобы просто создать новую страницу и форму перед выполнением работы писателя:
Page page = new Page();
page.EnableEventValidation = false;
HtmlForm form = new HtmlForm();
form.Name = "form1";
page.Controls.Add(form1);
MyControl mc = new MyControl();
form.Controls.Add(mc);
StringBuilder sb = new StringBuilder();
StringWriter sw = new StringWriter(sb);
HtmlTextWriter writer = new HtmlTextWriter(sw);
page.RenderControl(writer);
return sb.ToString();
К сожалению, это дает вам больше разметки, чем вам на самом деле нужно (поскольку она включает в себя фиктивную форму). И ScriptManager все равно потерпит неудачу по какой-то загадочной причине, которую я еще не разгадал. Честно говоря, это много проблем и не стоит делать; весь смысл генерации элементов управления в выделенном коде заключается в том, что вам, в конце концов, не нужно возиться с разметкой.