如何动态加载包含asp控件的UserControl

时间:2011-01-19 10:26:15

标签: asp.net

我有UserControl,它有asp控件(< asp:Button runat =“server”ID =“btn”/>),我想渲染它。

我试过1:

            Page loader = new Page();

            Control ctrl = loader.LoadControl("WebUserControl1.ascx");
            loader.Controls.Add(ctrl);
            loader.ProcessRequest(context);

            StringBuilder sb = new StringBuilder();
            StringWriter sw = new StringWriter(sb);
            HtmlTextWriter htw = new HtmlTextWriter(sw);

            loader.RenderControl(htw);

它不起作用,因为它说每个具有runat =“server”的控件必须是Form。

我也试过2:

因为loader.Form为null,我创建了HtmlForm并将ctrl添加到它,然后将HtmlForm添加到loader的Control中,但是它说它有2个HtmlForm。所以,我把HtmlForm“注入”加载器就像这样

            Page loader = new Page();

            HtmlForm form = new HtmlForm();
            var method = loader.GetType().GetMethod("SetForm", BindingFlags.NonPublic | BindingFlags.Instance);
            method.Invoke(loader, new object[] { form });

            Control ctrl = loader.LoadControl("WebUserControl1.ascx");
            loader.Form.Controls.Add(ctrl);
            loader.ProcessRequest(context);

            StringBuilder sb = new StringBuilder();
            StringWriter sw = new StringWriter(sb);
            HtmlTextWriter htw = new HtmlTextWriter(sw);

            loader.RenderControl(htw);

现在没有发生错误,但StringWriter为空

我的错误在哪里。 请不要告诉我将Page添加到解决方案并覆盖OnRender。我想像上面提到的那样去做。

谢谢

1 个答案:

答案 0 :(得分:0)

不要使用Form.Controls.Add,

将PlaceHolder控件添加到Form。并将控件添加到PlaceHolder。

PlaceHolder.Controls.Add(CTRL);

试试这个。