2011-01-19 88 views
1

我有用户控件有asp控件(< asp:Button runat =“server”ID =“btn”/ >),我想呈现它。如何动态加载包含asp控件的用户控件

我试过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 =控制“服务器”必须在表格。

我也试过2:

因为loader.Form是空的,我创建HtmlForm控件并添加了Ctrl键,然后加入到HtmlForm控件装载机的控制权,但它说,它有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的是空

哪里是我的错误。 请不要告诉我将页面添加到解决方案并重写OnRender。正如我上面提到的,我想这样做。

谢谢

回答

0

不使用Form.Controls.Add,

添加一个占位符控件的形式。并将控件添加到PlaceHolder。

PlaceHolder.Controls.Add(ctrl);

试试这个。

+0

我添加到第二个TRY这个代码:PlaceHolder ph = new PlaceHolder(); ph.Controls.Add(ctrl); loader.Form.Controls.Add(ph); loader.ProcessRequest(context);但StringWriter仍然是空的 – theateist 2011-01-19 10:52:47