Domanda

Ho una web part personalizzata su cui sto provando a chiamare il metodo RenderContents, ma i risultati contengono solo il div circostante per la web part e non alcun controllo figlio.

Prendiamo ad esempio questa semplice web part:

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."));
    }
  }
}

Quindi, in un gestore http, cerco di creare un'istanza di questa web part e di chiamarne il metodo RenderControl.Il risultato è <div class="myTestWebPart"></div>.

Qualcuno sa perché non ottengo i miei controlli da CreateChildControls anche aggiunti all'output?

È stato utile?

Soluzione

È perché quando crei solo un'istanza di un controllo e chiami RenderControl su di esso, senza che venga aggiunto a una raccolta di Controls, non fa parte del ciclo di vita della pagina che causa l'attivazione di tutti gli eventi.

In particolare, il PreRendering che chiama GuaranteChildControl non viene chiamato.

La soluzione più semplice è sovrascrivere Render in questo modo:

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

Altri suggerimenti

suggerirei di scrivere il codice nel metodo di rendering piuttosto che scrivere nel controllo createchild

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top