我有一个ASP.NET控件,我想获取它的HTML字符串,应该如何实现?
这似乎正常工作。
public string RenderControlToHtml(Control ControlToRender)
{
System.Text.StringBuilder sb = new System.Text.StringBuilder();
System.IO.StringWriter stWriter = new System.IO.StringWriter(sb);
System.Web.UI.HtmlTextWriter htmlWriter = new System.Web.UI.HtmlTextWriter(stWriter);
ControlToRender.RenderControl(htmlWriter);
return sb.ToString();
}
如果控件不是页面的一部分,那么David Basarab
所提供的答案将无法工作。a7drew
的答案似乎过于复杂- 不需要使用Context
或Server.Execute
。
private string RenderControl()
{
var sb = new System.Text.StringBuilder();
using (var stWriter = new System.IO.StringWriter(sb))
using (var htmlWriter = new HtmlTextWriter(stWriter))
{
var p = new Page();
var ctrl = (YourControl)p.LoadControl("~/controls/building blocks/YourControl.ascx");
ctrl.Visible = true;
// do your own init logic if needed
p.Controls.Add(ctrl);
ctrl.RenderControl(htmlWriter);
return sb.ToString();
}
}
ctrl.Visible = true;
这一行。 - Otto Gctrl.Visible = true;
是一种保险措施。在我的情况下,控件在标记中设置了 @Visible="false"@,导致它呈现为空字符串。 - liviriniu如果您的控件是Web用户控件,那么您可以通过以下方式从另一个页面或处理程序获取其发出的HTML:
public void GetHtmlFromMySweetControl(HttpContext context)
{
HttpRequest httpRequest = context.Request;
HttpResponse httpResponse = context.Response;
string foo = httpRequest["foo"];
Page pageHolder = new Page();
string path = "~/usercontrols/MySweetControl.ascx";
MySweetControl ctrl = (MySweetControl)pageHolder.LoadControl(path);
ctrl.BindProducts(foo);
pageHolder.Controls.Add(ctrl);
StringWriter sw = new StringWriter();
context.Server.Execute(pageHolder, sw, false);
httpResponse.Write(sw.ToString());
}