Pregunta

Tengo un elemento web personalizado en el que estoy tratando de llamar al método RenderContents, pero los resultados solo contienen el div circundante para el elemento web, y no ningún control secundario.

Tomemos, por ejemplo, este sencillo elemento web:

namespace MyWebParts
{
  public class MyTestWebPart : WebPart
  {
    public MyTestWebPart()
    {
      this.CssClass = "myTestWebPart";
    }
    protected override void CreateChildControls()
    {
      base.CreateChildControls();

      this.Controls.Add(new LiteralControl("Nothing here yet."));
    }
  }
}

Luego, en un controlador http, intento crear una instancia de este elemento web y llamar a su método RenderControl.El resultado es <div class="myTestWebPart"></div>.

¿Alguien sabe por qué no obtengo mis controles de CreateChildControls también agregados a la salida?

¿Fue útil?

Solución

Es porque cuando solo estás creando una instancia de un control y llamando a RenderControl en él, sin que se agregue a una colección de Controles, entonces no es parte del ciclo de vida de la página lo que hace que se activen todos los eventos.

En particular, no se llama al PreRendering que llama a GuaranteChildControl.

La solución fácil es anular Render de esta manera:

protected override void Render(HtmlTextWriter writer)
{
  EnsureChildControls();
  base.Render(writer);
}

Otros consejos

Sugeriría escribir su código en el método de renderizado en lugar de escribir en el control createchild

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top