2009-11-20 10 views
6

In meiner ASP.NET-Anwendung, ich lade eine .ascx dynamisch Loadcontrol verwenden, das folgende Muster verwenden:Viewstate von ascx verloren zwischen Postbacks

var ctrl = LoadControl("/path/to/control.ascx"); 
((ControlType)ctrl).SomeProperty = someData; 
placeholder.Controls.Add(ctrl); 

Das Steuerelement, das ich hinzufügen, speichert den SomeProperty Eigenschaftswert direkt zu Viewstate, wie folgt:

public int? SomeProperty 
{ 
    get { return (int?)ViewState["SomeProperty"]; } 
    set { ViewState["SomeProperty"] = value; } 
} 

Danach wird die ascx Kontrolle lebt ein Leben auf seinem eigenen und alles ist gut, bis Postback auftritt. Wenn die Seite zurücksendet, ist der Ansichtszustand plötzlich leer! Ich vermute, dass dies passiert, weil ich den ViewState manipuliere, bevor ich den instanziierten Ascx meiner Seite hinzufüge. Auch kann ich die Viewstate verhindern, indem Sie die folgende Zeile in der Page_Load() Methode meiner ascx Kontrolle verloren:

SomeProperty = SomeProperty; 

ich die oben für jede Eigenschaft tun, um sicherzustellen, dass die Viewstate beibehalten wird. Nun, gibt es einen schöneren Weg, dies zu tun? Das Bearbeiten des ViewState, nachdem der instanziierte ASCX zur Seite hinzugefügt wurde, ist keine Option. Ich brauche den Inhalt von ViewState in den Methoden Page_Init() und Page_Load(), die ausgelöst werden, sobald ich die ASCX-Datei zu meiner Seite hinzufüge.

Danke. die Steuerung neu erstellen und weisen Sie die ID zurück und es sollte automatisch die Viewstate zurück in laden.

+0

Ich stieß einmal auf ein ähnliches Problem, und in meinem Fall war das Problem, dass wir in unserer All-Time-Basepage alle Steuerelemente so eingestellt haben, dass sie viewstate nicht verwenden. Mein Punkt ist, dass das dynamische Hinzufügen von Steuerelementen nicht unbedingt das Problem sein muss, sondern versteckte Orte, an denen viewstate auf "disabled" gesetzt ist. –

Antwort

13

Werfen Sie einen Blick auf die ASP.NET Page Life Cycle und Understanding View State

+0

+1 gute Referenzen w/Erklärung –

+0

Danke, das hat es geklärt. Ich bin jetzt jedoch in einem Dilemma: Ich muss einige Steuerelemente in PageInit erstellen, abhängig vom Inhalt des Ansichtszustands (oder des versteckten Feldes, das auch nicht in Page_Init geladen wird). –

+0

Ohh, wenn Sie mit dem Hidden Field Ansatz gehen, müssen Sie in 'Request.Forms' nach dem Wert suchen. Das eigentliche Server-Steuerelement wird noch nicht geladen. Probieren Sie es aus. – Bob

1

Verfolgen Sie die ID des Usercontrol vor Postbacks dann auf Postbacks. View State wird nach der Initialisierung geladen, sodass Sie unter Page_Init nicht darauf zugreifen können. Es wäre besser, ein verstecktes Feld zu verwenden.

Wenn Sie den Ansichtszustand verwenden möchten, müssen Sie zuerst die Methode LoadViewState überschreiben (Denken Sie daran, die Nummer base.LoadViewState aufzurufen, bevor Sie versuchen, darauf zuzugreifen).

+0

Oh, ja, das habe ich vergessen zu sagen. Ich erstelle das Benutzersteuerelement für jeden Postback tatsächlich neu, und ich stelle sicher, dass die ID jedes Mal gleich ist. Das Problem besteht nicht darin, dass der ViewState nicht wiederhergestellt werden kann, sondern dass Änderungen am Viewstate zwischen LoadControl und placeHolder.Controls.Add nicht beibehalten werden, wenn ich die Änderungen nicht explizit wiederhole, nachdem das Steuerelement der Seite hinzugefügt wurde. –

3

Sie müssen das Steuerelement auch der Steuerelementsammlung hinzufügen, BEVOR Sie die Eigenschaft festlegen. ViewState wird erst aufgezeichnet, nachdem es der Steuerelementauflistung hinzugefügt wurde.

Verwandte Themen