如何获得.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)
呈现控件。
将StringWriter
给HtmlTextWriter
。
将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
转换成StringWriter
把HtmlWriter
转换成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 。