Das hat mich ein paar Stunden gekostet:
Ich hatte ein Repeater
-Steuerelement auf einer ASPX-Seite. In dem Repeater habe ich verschiedene Eingabefelder angezeigt (Textfeld, Auswahlliste, Kontrollkästchen, usw.).
Nach dem Postback der Seite, war jedoch der Inhalt immer leer; alle zuvor vom Benutzer gemachten Eingaben waren weg.
Grundsätzliche Einbindung des Repeaters
Wichtig ist zunächst, den Repeater nicht erst im Load
-Ereignis der Seite zu binden, sondern schon früher, im Init
-Ereignis:
protected override void OnInit(EventArgs e)
{
base.OnInit(e);
fillAndBindRepeater();
}
Mit der Füllfunktion in der Form:
private void fillAndBindRepeater()
{
var ds = new List<CustomFieldInputModel>();
// ... Liste füllen ...
FieldsRepeater.DataSource = ds.ToArray();
FieldsRepeater.DataBind();
}
Wichtig ist hier also, immer die Datenquelle zuzuweisen und zu binden, egal ob Postback oder nicht ist.
Ursache des Problems
Nach viel Try-and-Error habe ich herausgefunden, warum nach dem Postback alle Eingaben weg waren.
Ursache war ein Aufruf von DataBind()
in der OnLoad()
-Methode meiner (eigenen) Basisklasse der akuellen ASPX-Seite.
Habe ich den DataBind()
-Aufruf weggelassen, blieben die Werte erhalten.
Fehlersuche
Hilfreich war für mich, in meiner ASPX-Seite folgende Methoden kurzzeitig zu überschreiben:
public override void DataBind()
{
base.DataBind();
}
protected override void DataBind(bool raiseOnDataBinding)
{
base.DataBind(raiseOnDataBinding);
}
protected override void DataBindChildren()
{
base.DataBindChildren();
}
protected override void OnDataBinding(EventArgs e)
{
base.OnDataBinding(e);
}
Ich habe auf alle 4 Funktionen einen Debugger-Haltepunkt gesetzt und es anschließend im Debugger laufen lassen.
So konnte ich gut sehen, wo das Programm im Callstack war, als er eine der Funktionen aufgerufen hat.