WebPart RenderControl non esegue il rendering dei contenuti
-
29-10-2019 - |
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?
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