2012-06-07 16 views
6

Sono consapevole che questa domanda è stata posta molte volte prima ma sospetto di avere uno scenario unico.Proprietà null dopo il postback - Controllo caricato dinamicamente

Sto caricando un controllo figlio (ASCX) e l'impostazione di una proprietà su tale controllo. Funziona perfettamente fino al postback in cui la proprietà è nullo.

Con la presente la First Class, che carica il ChildControl:

protected override void CreateChildControls() 
{ 
    MyUserControl control = (MyUserControl)Page.LoadControl(_ascxPath); 
    control.MyProperty = base.MyProperty 
    Controls.Add(control); 
} 

Poi, sul mio Child Control Ho il seguente codice:

public partial class MyUserControl : UserControl 
{ 
    public MyType MyProperty { get; set; } 
    protected void Page_Load(object sender, EventArgs e) 
    { 
     //Exception on next line because Property is null (only on postback) 
     var somevalue = MyProperty.SubProperty; 
+0

Da dove viene chiamato 'CreateChildControls'? Viene sempre creato indipendentemente da cosa sia 'IsPostBack'? –

+0

Viene sempre chiamato. Questa è una soluzione Sharepoint. L'evento/metodo CreateChildControls() si trova in una classe che eredita da Microsoft.SharePoint.WebPartPages.WebPart. Dubito però se il problema è legato a Sharepoint. – Fox

risposta

12

Ok. Lasciami provare a spiegarlo.
1. Una volta che la pagina viene creata, si ottiene il pieno pagina lifecycle
2. Si fa clic su un certo controllo per creare il controllo dell'utente, e si ottiene
3. Ora si sta entrando in valore a questo controllo, e ottenere postback
4. Sul lato server viene gestito il postback, ma come puoi vedere le azioni viewstate appaiono non appena viene caricata la pagina.
Uno degli scopi principali di viewstate è gestire gli eventi di controllo, vedere se sono stati modificati o salvare i loro stati o qualcos'altro.
5. Se al momento, quando viene caricato lo stato di visualizzazione, il controllo non viene ancora creato, quindi tutti gli eventi e i valori verranno ignorati.

La soluzione lo rende statico e lo nasconde, o lo crea prima delle azioni viewstate avviate.

+0

Tx per un consiglio. Risponderà poco dopo aver modificato il codice. – Fox

+0

Grazie. Il tuo consiglio ha funzionato. Ho spostato il codice di inizializzazione della proprietà nell'evento OnInit e ora tutto ha funzionato correttamente. – Fox

+0

Benvenuto, ho dedicato molto tempo a questo problema quando l'ho affrontato da solo. –

5

È necessario aggiungere il controllo e impostare le proprietà nell'evento Page_Init, altrimenti si perderà il valore delle proprietà.

+0

Tx, impegnato a lavorare su quello. Torneremo presto con i risultati – Fox

+0

Grazie Imran. Anche il tuo consiglio ha aiutato. Purtroppo non posso contrassegnare due risposte come corrette, ma +1 a te. Tx – Fox

+2

Nessun problema caro, felice di avere una risposta, non importa chi ha dato. Cheers –

2

Nelle spiegazioni Microsoft sulla pagina ASP.NET life cycle, è scritto che i controlli creati dinamicamente devono essere creati in PreInit.

Ha funzionato per me. Qui è la mia pagina principale: (...)

protected global::System.Web.UI.HtmlControls.HtmlGenericControl FiltersZone; 

protected override void OnPreInit(EventArgs e) 
    { 
     base.OnPreInit(e); 
     FiltersZone.Controls.Add(new PlanningFiltersSurgeonWeb()); 
    } 

Questo ha creato in modo dinamico ".ascx" controllo contiene un campo nascosto:

<input id="hidTxtPaint" type="hidden" name="hidTxtPaint" runat="server" /> 

sono ora in grado per recuperare il suo valore dall'interno del controllo ASCX creato dinamicamente con l'evento Page_Load, dopo un "submit" o un "__dopostback('hidTxtPaint')" avviato da J avascript.

D'altra parte, il valore del campo nascosto è sempre vuoto dopo un POST se il suo controllo ".ascx" principale viene aggiunto nell'evento Page_Load della pagina principale.

+0

Una spiegazione completa che è più corretta e utile della risposta accettata - Grazie! – zanlok

Problemi correlati