Cómo obtener el contenido renderizado de un control ASP.NET

Patxi Echarte, February 28th, 2005

Todos los proyectos que realizo sobre ASP.NET utilizan diferentes controles web de usuario para montar la cabecera o el pie de la página, el menú, e incluso los contenidos. Sin embargo hay casos especiales en los que interesa acceder desde código a estos controles para obtener su html resultante, sin que este pase directamente a formar parte de la página.

En algunos casos es habitual cargar controles dinámicamente mediante el método LoadControl y añadirlos a la página. Esto es realmente sencillo y lo único que hay que tener en cuenta es el tipo al que se hace el cast al cargar el objeto. Así por ejemplo, si hacemos el cast a System.Web.UI.Control dispondremos únicamente de los métodos comunes a los controles web de ASP.NET, pero si necesitamos pasar algún valor al control, necesitaremos indicar el tipo específico al que hay que hacer el cast. Esto puede obligarnos a disponer de un interfaz ya precompilado si el control se compila “on the fly” y no tiene un archivo .cs asociado.

Una vez cargado un control dinámicamente lo habitual es añadirlo a algún contenedor en la página, pero puede darse el caso de que lo que necesitemos sea obtener su html, por ejemplo si necesitásemos mostrar la previsualización de un contenido. Para ello podemos utilizar el siguiente código:

// Primero creo un control que
System.Web.UI.WebControls.PlaceHolder phAux = new System.Web.UI.WebControls.PlaceHolder();
   
//
// Cargo el control
//
CMSControl ctrl = (ICMSControl)this.LoadControl(@"/cms/controls/Noticia.ascx");
   
// Indicamos mediante el identificador del contenido que hay que mostrar
ctrl.ObjectToRender = obj.Id;
   
// se llama al método GenerateOutput que hará
//lo necesario para obtener la maquetación del objeto
ctrl.GenerateOutput();
   
// Ahora necesitamos recuperar el html que contiene el control
// una vez generada la maquetación, ya que no queremos mostrar
// directamente el control en pantalla
   
StringBuilder sb = new StringBuilder();
StringWriter  sw = new StringWriter(sb);
HtmlTextWriter htw = new HtmlTextWriter(sw);
ctrl.RenderControl(htw);
   
// en sb tenemos un string con el contenido del control
// metemos el html en un campo de texto por ejemplo
tbBody.Text = sb.ToString().Trim();
   

Para obtener el contenido HTML del control se utiliza el método RenderControl, el cual acepta un HtmlTextWriter como parámetro, y sobre el cual se realiza el renderizado. Para obtener el HtmlTextWriter lo que hago es crear primero un StringBuilder, un StringWriter sobre éste, y finalmente un HtmlTextWriter que trabaje sobre el StringWriter.

Comparte esta información

Deja un comentario