51

如果我创建一个 UserControl 并向其中添加一些对象,我如何获取它会呈现的 HTML?

前任。

UserControl myControl = new UserControl();
myControl.Controls.Add(new TextBox());

// ...something happens

return strHTMLofControl;

我只想将新建的 UserControl 转换为 HTML 字符串。

4

7 回答 7

57

您可以使用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();
    }
}
于 2008-11-13T21:35:53.327 回答
32
//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();
于 2009-05-07T02:58:43.783 回答
15
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();
于 2011-01-23T23:10:34.417 回答
8

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

普遍接受的解决方案 - StringBuilderinto StringWriterinto HtmlWriterinto 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 仍然会因为一些我还没有弄明白的神秘原因而失败。老实说,这很麻烦,不值得做;毕竟,在代码隐藏中生成控件的全部目的是让您不必摆弄标记。

于 2015-07-24T21:03:51.643 回答
4

覆盖 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 输出。

于 2008-11-13T21:36:59.630 回答
1

调用它的.RenderControl()方法。

于 2008-11-13T21:34:19.633 回答
1

您可以使用该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 。

于 2017-02-01T14:22:55.257 回答