2012-06-07 8 views
6

Ich bin mir bewusst, dass diese Frage schon oft gestellt wurde, aber ich vermute, dass ich ein einzigartiges Szenario habe.Eigenschaft null nach Postback - dynamisch geladene Steuerelement

Ich werde ein Child Control (ASCX) laden und eine Eigenschaft auf diesem Steuerelement festlegen. Dies funktioniert bis Postback einwandfrei, wenn die Eigenschaft null ist.

Hier die erste Klasse, die die Child lädt:

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

Dann auf meinem Child Control habe ich den folgenden Code bekam:

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

Woher wird 'CreateChildControls' aufgerufen? Wird es immer erstellt, unabhängig davon, was "IsPostBack" ist? –

+0

Es wird immer aufgerufen. Dies ist eine Sharepoint-Lösung. Das CreateChildControls() -Ereignis/die Methode befindet sich in einer Klasse, die von Microsoft.SharePoint.WebPartPages.WebPart erbt. Ich bezweifle jedoch, wenn das Problem Sharepoint betrifft. – Fox

Antwort

12

Ok. Lass mich versuchen, es zu erklären.
1. Sobald Seite erstellt wird, erhalten Sie die volle Seite lifecycle
2. Sie auf einige Steuerelement klicken Benutzersteuerung zu erstellen, und Sie bekommen es
3. Nun treten Sie Wert dieser Steuerung und bekommen Postbacks
4. Auf der Serverseite wird Postback behandelt, aber wie Sie sehen können, werden Viewstate-Aktionen angezeigt, sobald die Seite geladen wird.
Eines der Hauptziele von viewstate ist die Behandlung von Kontrollereignissen, um zu sehen, ob sie geändert werden, oder um ihre Zustände oder etwas anderes zu speichern.
5. Wenn in dem Augenblick, in dem Viewstate geladen ist, das Control immer noch nicht aufgebaut ist, dann werden alle Events und Werte ignoriert.

Lösung entweder machen es statische Kontrolle und verstecken Sie es einfach, entweder erstellen Sie es vor Beginn der Viewstate-Aktionen.

+0

Tx für Beratung. Antwort wird kurz nach dem Ändern des Codes zurückgegeben. – Fox

+0

Danke. Dein Rat hat funktioniert. Ich habe den Code für die Property-Initialisierung in das OnInit-Event verschoben, und jetzt funktionierte alles einwandfrei. – Fox

+0

Ihr Willkommen, ich habe viel Zeit mit diesem Thema verbracht, als ich es selbst gesehen habe. –

5

Sie müssen die Steuerungs- und Set-Eigenschaften im Page_Init-Ereignis hinzufügen, andernfalls verlieren Sie den Eigenschaftswert.

+0

Tx, beschäftigt arbeiten daran. Werde bald mit den Ergebnissen zurückkommen – Fox

+0

Danke Imran. Ihr Rat hat auch geholfen. Leider kann ich zwei Antworten nicht als richtig, sondern +1 für Sie markieren. Tx – Fox

+2

Keine Sorgen liebes, froh, dass Sie die Antwort bekommen, spielt keine Rolle, wer gab. Prost –

2

In Microsoft Erklärungen über ASP.NET-Seite life cycle, es steht geschrieben, dass dynamisch erstellte Steuerelemente in PreInit erstellt werden müssen.

Es funktionierte für mich. Hier ist meine Haupt-Seite: (...)

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

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

Diese dynamisch erstellt ".ascx" Steuerung enthält ein verstecktes Feld:

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

Ich bin jetzt in der Lage um seinen Wert aus dem dynamisch erzeugten ASCX-Steuerelement Page_Load Ereignis nach einem "submit" oder einem "__dopostback('hidTxtPaint')", initiiert von J avascript.

Auf der anderen Seite ist der Wert des ausgeblendeten Felds nach einem POST immer leer, wenn das übergeordnete Steuerelement ".ascx" auf dem Page_Load-Ereignis der Hauptseite hinzugefügt wird.

+0

Eine umfassende Erklärung, die korrekter und hilfreicher ist als die angenommene Antwort - Danke! – zanlok