Textbox in einem Repeater war nach dem Postback leer

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.

Das ist hier gut beschrieben.

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.