Cómo obtengo la salida HTML de un UserControl in.NET (C#)?


Si creo un UserControl y le agrego algunos objetos, ¿cómo puedo tomar el HTML que renderizaría?

Ex.

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

// ...something happens

return strHTMLofControl;

Me gustaría convertir un control de usuario recién construido a una cadena de HTML.

Author: Marcel, 2008-11-14

7 answers

Puede renderizar el control usando Control.RenderControl(HtmlTextWriter).

Alimentar StringWriter a la HtmlTextWriter.

Alimentar StringBuilder a la StringWriter.

La 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();
 56
Author: azamsharp,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-04-20 13:23:28
//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();
 32
Author: Ben,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-05-07 02:58:43
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();
 13
Author: theJerm,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-01-23 23:37:44

Siete años de retraso, pero esto merece ser compartido.

La solución generalmente aceptada - StringBuilder en StringWriter en HtmlWriter en RenderControl - es buena. Pero hay algunas trampas, que desafortunadamente me encontré mientras intentaba hacer lo mismo. Algunos controles lanzarán errores si no están dentro de un Page, y otros lanzarán errores si no están dentro de un <form> con runat="server". El control ScriptManager muestra ambos comportamientos.

Finalmente encontré una solución aqui. La esencia de esto es básicamente solo crear una instancia de una nueva Página y Forma 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 marcado del que realmente necesita (ya que incluye el formulario ficticio). Y el ScriptManager todavía fallará por alguna razón arcana que aún no he desconcertado. Honestamente, es un montón de problemas y no vale la pena hacerlo; el objetivo de generar controles en el código detrás es para que no tenga que jugar con el marcado, después de todo.

 8
Author: Reikim,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-07-24 21:03:51

Anular 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.

Es posible que también desee mirar en la arquitectura de control adaptativo de asp.net arquitectura de control adaptativa de asp.net donde puede 'dar forma' a la salida html predeterminada de los controles.

 4
Author: Xian,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-11-13 21:43:04

Llame a su método .RenderControl().

 1
Author: Joel Coehoorn,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-11-13 21:34:19

Puedes 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 se activa 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 .

 1
Author: Carl in 't Veld,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-02-01 14:22:55