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.
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. –