7 年遅れましたが、これは共有するに値します。
一般的に受け入れられている解決策 - StringBuilder
into StringWriter
into HtmlWriter
into RenderControl
- は良いです。しかし、残念なことに、同じことをしようとしているときに出くわした落とし穴がいくつかあります。一部のコントロールは、 内にない場合にエラーをスローし、一部のコントロールはwithPage
内にない場合にエラーをスローします。ScriptManager コントロールは、これらの両方の動作を示します。<form>
runat="server"
最終的にここで回避策を見つけました。その要点は、基本的に、ライターの作業を行う前に、新しいページとフォームをインスタンス化することです。
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 は、まだ理解していない難解な理由で失敗します。正直なところ、これは大変な作業であり、やる価値はありません。コード ビハインドでコントロールを生成することの要点は、結局のところ、マークアップをいじる必要がないようにすることです。