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

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.

Twitter Digg Delicious Stumbleupon Technorati Facebook Email

2 Respuestas para “Cómo obtener el contenido renderizado de un control ASP.NET”

  1. Bueno yo tengo unas preguntas pero no se si las puedan resolver a estas alturas porque este tema fue creado en el 2005

    Yo uso VisualStudio 2008 y quisiera saber

    1) CMSControl es un control que tu mismo creaste o viene junto con VS?

    2) Si quiero hacer un ciclo (for/while/etc…) en donde por cada iteracion quiera que se cree un nuevo control mio, pero que

  2. Hola Aquiles. El control CMSControl es parte de un proyecto que hice en esas fechas, por lo que el método que describo debería funcionar con cualquier otro control. Lo que no te puedo asegurar es que no haya alguna otra forma de hacerlo, ya que como dices el post es del 2005 y desde entonces he tocado poco ASP.NET.

    Respecto a la segunda pregunta se te ha quedado a medias 😉