Archive for the ‘ASP.net’ Category

To Postback or not to Postback

September 9, 2006

Der ASP.net Lebenszyklus ist verwirrend genug, aber mir scheint die neuen Webparts in ASP.net 2.0 – so wunderbar sie auch sind – verkomplizieren die Sachen irgendwie schon wieder?

Mein Fall, eine einfach ASP.net 2.0 Anwendung, Masterpages + Webparts. Eine der Webparts lädt ein Custom Web Control, das selber wiederum von der composite Art ist (also statt selber HTML zu rendern, nutze ich ASP.net Controls, die zusammenfüge und das Rendern übernehmen).

Soweit nichts schwierigies, in CreateChildControls die Controls erstellt und die Event Handler an verschiedene LinkButtons gehängt. Nun füge ich den Webpart auf meine Seite ein und rufe die Seite auf. Wunderbar gerendert, aber die Postbacks funktionieren nicht.

Hmm… der Postback-Event schaut im Browser ok aus. Testweise also nur das Custom Control auf die Seite gegeben (also ohne Webpart). Das selbe Verhalten. Gut, ich leite die Klasse statt von WebControl mal von WebPart ab (immerhin operiere ich ja in eine WebpartZone) und da schau her, die Postbacks gehen.

Aber das kann es ja nicht sein, also zurück auf WebControl umgestellt und ein wenig gegoogelt und diesen Foreneintrag gefunden.

Ein Auszug:

For most web controls to fire postback events they need to have their ViewState loaded.  For dynamically loaded controls this means loading the control prior to the LoadViewState event to ensure the control receives its ViewState.  This means loading the control in Page_Init.  That should be the only change you need.

Also schnell EnsureChildControls in der OnInit dazugefügt und nun funktionieren die Postbacks auch im WebControl. Aber wieso brauche ich das nur für WebControl und nicht für WebPart?

Ein wenig weiter gegoogelt und auf das hier gestoßen.

On initial request (non-postback) EnsureChildControls is called at PreRender stage of the Page. At postback it is called when postback data handling for the first control occurs, that is when FindControl is called which automatically invokes EnsureChildControls first. This happens before Page_Load at first postback data processing stage.

Das könnte also erklären wieso es bei WebParts funktioniert, wenn dort in einer genügend frühen Phase im ASP.net Zyklus ein FindControl aufgerufen wird.

Ob das stimmt, kann ich diesesmal nur vermuten. Zu spät um noch weiter zu recherchieren :)

Zu guter letzt noch ein Link zu einer schönen textuellen Übersicht über die ASP.net Zyklus.