¿Cómo obtengo el resultado HTML de un UserControl en.NET(C#)?
user-controls render-html (7)
Llamar es el método .RenderControl()
.
Si creo un UserControl y agrego algunos objetos a él, ¿cómo puedo obtener el HTML que representará?
ex.
UserControl myControl = new UserControl();
myControl.Controls.Add(new TextBox());
// ...something happens
return strHTMLofControl;
Me gustaría simplemente convertir un UserControl recién creado en una cadena de HTML.
anula el método 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);
}
Esto le dará acceso al escritor en el que se escribirá el HTML.
También es posible que desee examinar la arquitectura de control adaptativo de la arquitectura de control adaptativo asp.net de asp.net donde puede "dar forma" a la salida html predeterminada de los controles.
//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();
Puede renderizar el control utilizando Control.RenderControl(HtmlTextWriter)
.
Feed StringWriter
para HtmlTextWriter
.
Alimentar StringBuilder
al StringWriter
.
Su cadena generada estará dentro del objeto StringBuilder
.
Aquí hay un ejemplo de código para esta solución:
StringBuilder myStringBuilder = new StringBuilder();
TextWriter myTextWriter = new StringWriter(myStringBuilder);
HtmlTextWriter myWriter = new HtmlTextWriter(myTextWriter);
myControl.RenderControl(myWriter);
string html = myTextWriter.ToString();
Puede utilizar el método HttpServerUtility.Execute
, disponible a través de 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);
El beneficio sería que también active el evento Page_Load de su control de usuario.
La documentación de MSDN se puede encontrar aquí: https://msdn.microsoft.com/en-us/library/fb04e8f7(v=vs.110).aspx .
Siete años tarde, pero esto merece ser compartido.
La solución generalmente aceptada - StringBuilder
en StringWriter
en HtmlWriter
en RenderControl
- es buena. Pero hay algunos errores, que desafortunadamente encontré intentando hacer lo mismo. Algunos controles lanzarán errores si no están dentro de una Page
, y algunos arrojarán errores si no están dentro de un <form>
con runat="server"
. El control ScriptManager exhibe ambos comportamientos.
Finalmente encontré una solución aquí. Lo esencial es básicamente crear una nueva página y formulario antes de hacer el trabajo de escritor:
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();
Desafortunadamente, esto le da más margen de beneficio del que realmente necesita (ya que incluye la forma ficticia). Y el ScriptManager aún fallará por alguna razón misteriosa que aún no he descifrado. Honestamente, es un montón de problemas y no vale la pena hacerlo; El objetivo de generar controles en el código subyacente es que, después de todo, no tiene que jugar con el marcado.