如何获得.NET(C#)中的UserControl的HTML输出?

如果我创build一个UserControl并添加一些对象,我怎样才能抓住它将呈现的HTML?

恩。

UserControl myControl = new UserControl(); myControl.Controls.Add(new TextBox()); // ...something happens return strHTMLofControl; 

我想只是将新build的UserControl转换为一个HTMLstring。

您可以使用Control.RenderControl(HtmlTextWriter)呈现控件。

StringWriterHtmlTextWriter

StringBuilder馈送到StringWriter

你生成的string将在StringBuilder对象中。

以下是此解决scheme的代码示例:

 StringBuilder myStringBuilder = new StringBuilder(); TextWriter myTextWriter = new StringWriter(myStringBuilder); HtmlTextWriter myWriter = new HtmlTextWriter(myTextWriter); myControl.RenderControl(myWriter); string html = myTextWriter.ToString(); 
 //render control to string StringBuilder b = new StringBuilder(); HtmlTextWriter h = new HtmlTextWriter(new StringWriter(b)); this.LoadControl("~/path_to_control.ascx").RenderControl(h); string controlAsString = b.ToString(); 
 UserControl uc = new UserControl(); MyCustomUserControl mu = (MyCustomUserControl)uc.LoadControl("~/Controls/MyCustomUserControl.ascx"); TextWriter tw = new StringWriter(); HtmlTextWriter hw = new HtmlTextWriter(tw); mu.RenderControl(hw); return tw.ToString(); 

晚了七年,但这是值得分享的。

普遍接受的解决scheme – 将StringBuilder转换成StringWriterHtmlWriter转换成RenderControl – 是很好的。 但是还有一些问题,我不幸遇到了同样的问题。 如果某些控件不在Page内部,则会引发错误,如果它们不在带有runat="server"<form> ,则会引发错误。 ScriptManager控件展现了这两种行为。

我最终在这里find了一个解决方法。 它的要点基本上就是在做作家工作之前实例化一个新的Page和Form。

 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仍然会失败,因为我还没有困惑的一些奥术理由。 老实说,这是一个很大的麻烦,不值得去做。 毕竟在代码隐藏中生成控件的这一点是完全不需要摆弄标记的。

重写REnderControl方法

 protected override void Render(HtmlTextWriter output) { output.Write("<br>Message from Control : " + Message); output.Write("Showing Custom controls created in reverse" + "order"); // Render Controls. RenderChildren(output); } 

这将使您可以访问HTML将被写入的作者。

您可能还想研究一下asp.net 自适应控制体系结构的自适应控制体系结构 ,您可以在其中“控制”来自控件的默认html输出。

调用它的.RenderControl()方法。

您可以利用HttpServerUtility.Execute方法,通过HttpContext.Current.Server.Execute

 var page = new Page(); var myControl = (MyControl)page.LoadControl("mycontrol.ascx"); myControl.SetSomeProperty = true; page.Controls.Add(myControl); var sw = new StringWriter(); HttpContext.Current.Server.Execute(page, sw, preserveForm: false); 

好处是你也触发了用户控件的Page_Load事件。

MSDN文档可以在这里find: https : //msdn.microsoft.com/en-us/library/fb04e8f7(v=vs.110).aspx 。