如果我创建一个 UserControl 并向其中添加一些对象,我如何获取它会呈现的 HTML?
前任。
UserControl myControl = new UserControl();
myControl.Controls.Add(new TextBox());
// ...something happens
return strHTMLofControl;
我只想将新建的 UserControl 转换为 HTML 字符串。
如果我创建一个 UserControl 并向其中添加一些对象,我如何获取它会呈现的 HTML?
前任。
UserControl myControl = new UserControl();
myControl.Controls.Add(new TextBox());
// ...something happens
return strHTMLofControl;
我只想将新建的 UserControl 转换为 HTML 字符串。
您可以使用Control.RenderControl(HtmlTextWriter)
.
喂给. StringWriter
_HtmlTextWriter
喂给. StringBuilder
_StringWriter
您生成的字符串将在StringBuilder
对象内。
这是此解决方案的代码示例:
string html = String.Empty;
using (TextWriter myTextWriter = new StringWriter(new StringBuilder()))
{
using (HtmlTextWriter myWriter = new HtmlTextWriter(myTextWriter))
{
myControl.RenderControl(myWriter);
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();
晚了七年,但这值得分享。
普遍接受的解决方案 - StringBuilder
into StringWriter
into HtmlWriter
into RenderControl
- 是好的。但是有一些陷阱,不幸的是我在尝试做同样的事情时遇到了这些陷阱。一些控件如果不在 a 内就会抛出错误,而有些控件如果不在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 仍然会因为一些我还没有弄明白的神秘原因而失败。老实说,这很麻烦,不值得做;毕竟,在代码隐藏中生成控件的全部目的是让您不必摆弄标记。
覆盖 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 的 自适应控制体系结构 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 文档可以在这里找到:https ://msdn.microsoft.com/en-us/library/fb04e8f7(v=vs.110).aspx 。