¿Cómo obtengo el resultado HTML de un UserControl en .NET (C #)?

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.

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(); 
 //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(); 

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

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 objective de generar controles en el código subyacente es que, después de todo, no tiene que jugar con el marcado.

anula el método REnderControl

 protected override void Render(HtmlTextWriter output) { output.Write("
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 architecture de control adaptativo de la architecture de control adaptativo asp.net de asp.net donde puede “dar forma” a la salida html predeterminada de los controles.

Llamar es el método .RenderControl() .

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 .