Übersicht über den Lebenszyklus von ASP.NET-Seiten

Aktualisiert: November 2007

Bei der Ausführung einer ASP.NET-Seite durchläuft diese Seite einen Lebenszyklus, der sich aus einer Reihe von Verarbeitungsschritten zusammensetzt. Dazu zählen unter anderem die Initialisierung, das Instanziieren von Steuerelementen, das Wiederherstellen und Aufrechterhalten des Zustands, das Ausführen von Ereignishandlercode und das Rendern. Es ist wichtig, sich mit dem Lebenszyklus einer Seite vertraut zu machen, damit Code entsprechend der Phase eines Lebenszyklus geschrieben werden kann, um die beabsichtigte Wirkung zu erzielen. Besonders bei der Entwicklung benutzerdefinierter Steuerelemente ist es erforderlich, dass Sie mit dem Lebenszyklus der Seite vertraut sind, damit Sie Steuerelemente ordnungsgemäß initialisieren, Steuerelementeigenschaften mit Ansichtszustandsdaten auffüllen und den gewünschten Verhaltenscode von Steuerelementen ausführen können. (Der Lebenszyklus eines Steuerelements basiert auf dem Lebenszyklus der Seite, aber die Seite löst mehr Ereignisse für ein Steuerelement aus, als für eine ASP.NET-Seite allein verfügbar sind.)

Allgemeine Phasen im Lebenszyklus von Seiten

Im Allgemeinen durchläuft die Seite die in der folgenden Tabelle dargestellten Phasen. Zusätzlich zu den Phasen im Lebenszyklus der Seite gibt es Anwendungsphasen, die vor und nach einer Anforderung eintreten. Diese Phasen sind jedoch nicht seitenspezifisch. Weitere Informationen finden Sie unter Übersicht über den Lebenszyklus von ASP.NET-Anwendungen für IIS 5.0 und 6.0.

Phase

Beschreibung

Seitenanforderung

Der Lebenszyklus einer Seite beginnt, nachdem die Seite angefordert wurde. Wenn ein Benutzer die Seite anfordert, prüft ASP.NET, ob die Seite analysiert und kompiliert werden muss (Beginn des Lebenszyklus einer Seite) oder ob eine zwischengespeicherte Version der Seite zurückgesendet werden kann, ohne dass die Seite verarbeitet werden muss.

Starten

In der Startphase werden Seiteneigenschaften wie Request und Response festgelegt. In dieser Phase wird auch bestimmt, ob es sich bei der Anforderung um ein Postback oder um eine neue Anforderung handelt, und die IsPostBack-Eigenschaft wird entsprechend festgelegt. Außerdem wird in der Startphase die UICulture-Eigenschaft festgelegt.

Seiteninitialisierung

Während der Seiteninitialisierung sind die Steuerelemente auf der Seite verfügbar, und die UniqueID-Eigenschaft jedes Steuerelements wird festgelegt. Ebenso werden gegebenenfalls Designs für die Seite übernommen. Wenn es sich bei der aktuellen Anforderung um ein Postback handelt, sind die Postbackdaten noch nicht geladen, und die Eigenschaftenwerte des Steuerelements wurden noch nicht mit den Werten aus dem Ansichtszustand wiederhergestellt.

Laden

Wenn es sich bei der aktuellen Anforderung um ein Postback handelt, werden die Steuerelementeigenschaften während der Ladephase mithilfe von Informationen aus dem Ansichtszustand und dem Steuerelementzustand wiederhergestellt.

Validierung

Während der Validierung wird die Validate-Methode aller Validierungssteuerelemente aufgerufen, die die IsValid-Eigenschaft einzelner Validierungssteuerelemente sowie der Seite festlegt.

Behandlung von Postbackereignissen

Wenn es sich bei der Anforderung um ein Postback handelt, werden sämtliche Ereignishandler aufgerufen.

Rendern

Vor der Darstellung werden der Ansichtszustand für die Seite sowie alle Steuerelemente gespeichert. Während der Wiedergabephase wird von der Seite die Render-Methode für jedes Steuerelement aufgerufen. Dadurch wird ein Textschreiber bereitgestellt, der eine Ausgabe in OutputStream der Response-Eigenschaft der Seite schreibt.

Entladen

Nachdem die Seite vollständig dargestellt und an den Client gesendet wurde und daher verworfen werden kann, wird der Entladevorgang aufgerufen. An dieser Stelle werden Seiteneigenschaften wie Response und Request entladen, und es werden sämtliche Bereinigungsoperationen ausgeführt.

Lebenszyklusereignisse

Die Seite löst in jeder Phase ihres Lebenszyklus Ereignisse aus, die Sie behandeln können, um eigenen Code auszuführen. Bei Steuerelementereignissen wird der Ereignishandler entweder deklarativ mithilfe von Attributen wie onclick oder im Code an das Ereignis gebunden.

Seiten unterstützen auch automatische Ereignisverknüpfung. Dies bedeutet, dass ASP.NET beim Auslösen bestimmter Ereignisse nach Methoden mit bestimmten Namen sucht und diese automatisch ausführt. Wenn das AutoEventWireup-Attribut der @-Seitendirektive auf true festgelegt ist (oder nicht definiert ist, da es standardmäßig auf true festgelegt ist), werden Seitenereignisse automatisch an Methoden gebunden, die die Namenskonvention Page_Ereignis verwenden, z. B. Page_Load und Page_Init. Weitere Informationen zur automatischen Ereignisverknüpfung finden Sie unter Ereignismodell für ASP.NET-Webserversteuerelemente.

In der folgenden Tabelle werden die Lebenszyklusereignisse der Seite aufgelistet, die am häufigsten verwendet werden. Darüber hinaus gibt es weitere als die aufgelisteten Ereignisse. Bei den meisten Szenarien der Seitenverarbeitung finden diese jedoch keine Verwendung. Stattdessen werden sie hauptsächlich von Serversteuerelementen auf der ASP.NET-Webseite für die Initialisierung und die Darstellung verwendet. Wenn Sie eigene ASP.NET-Serversteuerelemente schreiben möchten, sollten Sie umfangreiche Kenntnisse über diese Phasen besitzen. Informationen zum Erstellen benutzerdefinierter Steuerelemente finden Sie unter Entwickeln von benutzerdefinierten ASP.NET-Serversteuerelementen.

Seitenereignis

Typische Verwendung

PreInit

Verwenden Sie dieses Ereignis für folgende Vorgänge:

  • Prüfen mithilfe der IsPostBack-Eigenschaft, ob die Seite zum ersten Mal verarbeitet wird.

  • Erstellen oder erneutes Erstellen von dynamischen Steuerelementen.

  • Dynamisches Festlegen einer Masterseite.

  • Dynamisches Festlegen der Theme-Eigenschaft.

  • Lesen oder Festlegen von Profileigenschaftenwerten.

    Hinweis:
    Wenn es sich bei der Anforderung um ein Postback handelt, wurden die Werte der Steuerelemente noch nicht aus dem Ansichtszustand wiederhergestellt. Wenn Sie in dieser Phase eine Steuerelementeigenschaft festlegen, wird ihr Wert möglicherweise beim nächsten Ereignis überschrieben.

Init

Dieses Ereignis wird ausgelöst, nachdem alle Steuerelemente initialisiert und alle Skineinstellungen übernommen wurden. Verwenden Sie dieses Ereignis zum Lesen oder Initialisieren von Steuerelementeigenschaften.

InitComplete

Wird vom Page-Objekt ausgelöst. Verwenden Sie dieses Ereignis zum Verarbeiten von Aufgaben, für die die gesamte Initialisierung abgeschlossen sein muss.

PreLoad

Verwenden Sie dieses Ereignis, wenn vor dem Load-Ereignis eine Verarbeitung der Seite oder des Steuerelements ausgeführt werden muss.

Nachdem dieses Ereignis von Page ausgelöst wurde, wird der eigene Ansichtszustand und der aller Steuerelemente geladen. Anschließend werden die in der Request-Instanz enthaltenen Postbackdaten verarbeitet.

Load

Page ruft die OnLoad-Ereignismethode in Page auf. Dieser Schritt wird rekursiv für alle untergeordneten Steuerelemente und deren untergeordnete Steuerelemente wiederholt, bis die Seite und die Steuerelemente vollständig geladen sind.

Mit der OnLoad-Ereignismethode können Sie Eigenschaften in Steuerelementen festlegen und Datenbankverbindungen herstellen.

Steuerelementereignisse

Verwenden Sie diese Ereignisse, um bestimmte Steuerelementereignisse zu verwalten, wie z. B. das Click-Ereignis eines Button-Steuerelements oder das TextChanged-Ereignis eines TextBox-Steuerelements.

Hinweis:
Überprüfen Sie bei einer Postbackanforderung die IsValid-Eigenschaft von Page und einzelnen Validierungssteuerelemente vor der Verarbeitung, wenn die Seite Validierungssteuerelemente enthält.

LoadComplete

Verwenden Sie dieses Ereignis für Aufgaben, für die alle anderen Steuerelemente auf der Seite geladen sein müssen.

PreRender

Vor dem Auslösen dieses Ereignisses:

  • EnsureChildControls wird vom Page-Objekt für jedes Steuerelement sowie für die Seite aufgerufen.

  • Die DataBind-Methode wird von jedem datengebundenen Steuerelement aufgerufen, dessen DataSourceID-Eigenschaft festgelegt wurde. Weitere Informationen finden Sie weiter unten in diesem Thema unter Datenbindungsereignisse für datengebundene Steuerelemente.

Das PreRender-Ereignis wird für jedes Steuerelement auf der Seite ausgelöst. Verwenden Sie das Ereignis, um abschließende Änderungen am Inhalt der Seite oder an darin enthaltenen Steuerelementen vorzunehmen.

SaveStateComplete

Vor dem Auslösen dieses Ereignisses wurde ViewState für die Seite und für alle Steuerelemente gespeichert. Alle Änderungen an der Seite oder an den Steuerelementen werden ab diesem Zeitpunkt ignoriert.

Verwenden Sie dieses Ereignis, um Aufgaben durchzuführen, für die der Ansichtszustand gespeichert werden muss, bei denen jedoch keine Änderungen an Steuerelementen vorgenommen werden.

Render

Hierbei handelt es sich nicht um ein Ereignis. Stattdessen wird diese Methode in dieser Phase der Verarbeitung vom Page-Objekt für jedes Steuerelement aufgerufen. Alle ASP.NET-Webserversteuerelemente verfügen über eine Render-Methode, von der das Markup des Steuerelements ausgegeben wird, das an den Browser gesendet wird.

Wenn Sie ein benutzerdefiniertes Steuerelement erstellen, überschreiben Sie diese Methode normalerweise, um das Markup des Steuerelements auszugeben. Wenn Ihr benutzerdefiniertes Steuerelement jedoch nur standardmäßige ASP.NET-Webserversteuerelemente und kein benutzerdefiniertes Markup enthält, muss die Render-Methode nicht überschrieben werden. Weitere Informationen finden Sie unter Entwickeln von benutzerdefinierten ASP.NET-Serversteuerelementen.

Bei einem Benutzersteuerelement (ASCX-Datei) wird die Darstellung automatisch mit eingebunden. Daher ist eine explizite Wiedergabe im Code des Steuerelements nicht erforderlich.

Unload

Dieses Ereignis wird für jedes Steuerelement und anschließend für die Seite ausgelöst. Verwenden Sie dieses Ereignis für die abschließende Bereinigung bestimmter Steuerelemente, wie z. B. für das Schließen steuerelementspezifischer Datenbankverbindungen.

Die Seite selbst kann mit diesem Ereignis ebenfalls abschließend bereinigt werden. Dabei werden offene Dateien und Datenbankverbindungen geschlossen und Anmeldevorgänge bzw. andere anforderungsspezifische Aufgaben abgeschlossen.

Hinweis:
Die Seite und ihre Steuerelemente wurden während der Phase des Entladens gerendert. Daher können Sie keine weiteren Änderungen an dem Antwortstream vornehmen. Bei dem Versuch, eine Methode aufzurufen, z. B. die Response.Write-Methode, wird von der Seite eine Ausnahme ausgelöst.

Ergänzende Betrachtungen zum Lebenszyklus einer Seite

Einzelne ASP.NET-Serversteuerelemente verfügen über einen eigenen Lebenszyklus, der dem Lebenszyklus der Seite ähnelt. So werden zum Beispiel das Init-Ereignis und das Load-Ereignis eines Steuerelements während der entsprechenden Seitenereignisse ausgelöst.

Obwohl Init und Load rekursiv für jedes Steuerelement ausgelöst werden, geschieht dies in umgekehrter Reihenfolge. Das Init-Ereignis wird (zusammen mit dem Unload-Ereignis) für jedes untergeordnete Steuerelement aufgerufen, bevor das zugehörige Ereignis für dessen Container ausgelöst wird (von unten nach oben). Das Load-Ereignis für einen Container wird dagegen vor den Load-Ereignissen für die zugehörigen untergeordneten Steuerelemente aufgerufen (von oben nach unten).

Darstellung und Inhalt eines Steuerelements können durch eine Behandlung der zugehörigen Ereignisse angepasst werden, wie z. B. des Click-Ereignisses beim Button-Steuerelement und des SelectedIndexChanged-Ereignisses beim ListBox-Steuerelement. Unter bestimmten Umständen kann auch das DataBinding-Ereignis oder das DataBound-Ereignis eines Steuerelements behandelt werden. Weitere Informationen finden Sie in den Themen der Klassenreferenz zu den einzelnen Steuerelementen sowie unter Entwickeln von benutzerdefinierten ASP.NET-Serversteuerelementen.

Wenn eine Klasse von der Page-Klasse geerbt wird, können Sie neben der Behandlung von Ereignissen, die von der Seite ausgelöst werden, auch Methoden aus der Basisklasse der Seite überschreiben. So können Sie zum Beispiel die InitializeCulture-Methode der Seite dahingehend überschreiben, dass Kulturinformationen dynamisch festgelegt werden. Beachten Sie, dass beim Erstellen eines Ereignishandlers unter Verwendung der Page_Ereignis-Syntax die Basisimplementierung implizit aufgerufen wird und Sie daher diese Basisimplementierung in Ihrer Methode nicht mehr aufrufen müssen. So wird zum Beispiel die OnLoad-Methode der Basisseitenklasse immer aufgerufen, unabhängig davon, ob Sie eine Page_Load-Methode erstellen oder nicht. Wenn Sie jedoch die OnLoad-Methode der Seite mit dem override-Schlüsselwort (Overrides in Visual Basic) überschreiben, müssen Sie die Basismethode explizit aufrufen. Wenn Sie zum Beispiel die OnLoad-Methode der Seite überschreiben, müssen Sie base.Load (MyBase.Load in Visual Basic) aufrufen, damit die Basisimplementierung ausgeführt wird.

Synchronisieren von Ereignissen für hinzugefügte Steuerelemente

Wenn Steuerelemente dynamisch zur Laufzeit oder deklarativ in Vorlagen datengebundener Steuerelemente erstellt werden, werden die zugehörigen Ereignisse mit denen anderer Steuerelemente der Seite zunächst nicht synchronisiert. Beispielsweise können das Init-Ereignis und das Load-Ereignis bei einem Steuerelement, das zur Laufzeit hinzugefügt wird, viel später im Lebenszyklus der Seite auftreten als die gleichen Ereignisse bei Steuerelementen, die deklarativ erstellt werden. Daher lösen dynamisch hinzugefügte Steuerelemente sowie Steuerelemente in Vorlagen die Ereignisse ab dem Zeitpunkt ihrer Instanziierung nacheinander aus, bis sie mit dem Ereignis synchronisiert sind, bei dem sie zur Controls-Auflistung hinzugefügt wurden.

Dies muss normalerweise nur beachtet werden, wenn geschachtelte datengebundene Steuerelemente vorhanden sind. Wenn ein untergeordnetes Steuerelement an Daten gebunden wurde, das zugehörige Containersteuerelement jedoch noch nicht, sind die Daten im untergeordneten Steuerelement mit den Daten im Containersteuerelement möglicherweise nicht synchronisiert. Dies kann insbesondere der Fall sein, wenn von den Daten im untergeordneten Steuerelement eine Verarbeitung auf Basis eines datengebundenen Werts im Containersteuerelement durchgeführt wird.

Dies kann beispielsweise der Fall sein, wenn von GridView in jeder Zeile ein Firmendatensatz zusammen mit einer Liste der Firmenchefs in einem ListBox-Steuerelement angezeigt wird. Um die Liste der Firmenchefs zu füllen, wird das ListBox-Steuerelement an ein Datenquellensteuerelement gebunden (wie z. B. SqlDataSource), von dem die Daten der Firmenchefs mithilfe der CompanyID in einer Abfrage abgerufen werden.

Wenn die Datenbindungseigenschaften des ListBox-Steuerelements, wie z. B. DataSourceID und DataMember, deklarativ festgelegt werden, versucht das ListBox-Steuerelement während des DataBinding-Ereignisses der zugehörigen Zeile, eine Bindung mit der zugehörigen Datenquelle einzugehen. Das Feld CompanyID der Zeile enthält jedoch keinen Wert, bis das RowDataBound-Ereignis des GridView-Steuerelements ausgelöst wird. In diesem Fall wird das untergeordnete Steuerelement (das ListBox-Steuerelement) vor dem Steuerelement gebunden, in dem es enthalten ist (das GridView-Steuerelement). Die Phasen der Datenbindung sind daher nicht synchronisiert.

Um diesen Zustand zu vermeiden, legen Sie das Datenquellensteuerelement des ListBox-Steuerelements im gleichen Vorlagenelement fest wie das ListBox-Steuerelement selbst, und legen Sie die Datenbindungseigenschaften von ListBox nicht deklarativ fest. Stattdessen legen Sie diese programmgesteuert zur Laufzeit während des RowDataBound-Ereignisses fest, sodass das ListBox-Steuerelement erst an die Daten gebunden wird, wenn die CompanyID-Informationen verfügbar sind.

Weitere Informationen finden Sie unter Binden an Daten mit einem Datenquellensteuerelement.

Datenbindungsereignisse für datengebundene Steuerelemente

Zum besseren Verständnis der Beziehung zwischen dem Lebenszyklus der Seite und Datenbindungsereignissen sind in der folgenden Tabelle datenbezogene Ereignisse von datengebundenen Steuerelementen aufgelistet, wie z. B. den Steuerelementen GridView, DetailsView und FormView.

Steuerelementereignis

Typische Verwendung

DataBinding

Dieses Ereignis wird von datengebundenen Steuerelementen vor dem PreRender-Ereignis des Steuerelements, in dem es enthalten ist, (bzw. des Page-Objekts) ausgelöst und markiert den Beginn der Bindung des Steuerelements an die Daten.

Mit diesem Ereignis können Sie ggf. Datenbankverbindungen manuell herstellen. (Durch die Datenquellensteuerelemente ist dies häufig nicht erforderlich.)

RowCreated (nur GridView) oder ItemCreated (Steuerelemente DataList, DetailsView, SiteMapPath, DataGrid, FormView, Repeater und ListView)

Mit diesem Ereignis können Sie Inhalte bearbeiten, die nicht von Datenbindung abhängig sind. Beispielsweise können Sie zur Laufzeit programmgesteuert eine Formatierung zu einer Kopf- oder Fußzeile in einem GridView-Steuerelement hinzufügen.

RowDataBound (nur GridView) oder ItemDataBound (Steuerelemente DataList, SiteMapPath, DataGrid, Repeater und ListView)

Wenn dieses Ereignis ausgelöst wird, sind Daten in der Zeile oder in dem Element enthalten. Die Daten können formatiert werden, oder die FilterExpression-Eigenschaft für untergeordnete Datenquellensteuerelemente kann so festgelegt werden, dass verknüpfte Daten in der Zeile oder dem Element angezeigt werden.

DataBound

Dieses Ereignis markiert das Ende von Datenbindungsvorgängen in einem datengebundenen Steuerelement. In einem GridView-Steuerelement ist die Datenbindung für alle Zeilen und untergeordneten Steuerelemente abgeschlossen.

Verwenden Sie dieses Ereignis, um datengebundene Inhalte zu formatieren oder die Datenbindung in anderen Steuerelementen zu initialisieren, die von den Inhaltswerten des aktuellen Steuerelements abhängig sind. (Ausführliche Informationen finden Sie unter "Synchronisieren von Ereignissen für hinzugefügte Steuerelemente" weiter oben in diesem Thema.)

Anmeldesteuerelementereignisse

Mithilfe der Einstellungen in der Datei Web.config kann das Login-Steuerelement die Authentifizierung von Mitgliedschaften automatisch verwalten. Wenn die Funktionsweise des Steuerelements jedoch an Ihre Anwendung angepasst werden muss oder Sie verstehen möchten, wie Ereignisse des Login-Steuerelements mit dem Lebenszyklus einer Seite in Zusammenhang stehen, können Sie die Ereignisse in der folgenden Tabelle verwenden.

Steuerelementereignis

Typische Verwendung

LoggingIn

Dieses Ereignis wird während eines Postbacks ausgelöst, nachdem das LoadComplete-Ereignis der Seite aufgerufen wurde. Es markiert den Anfang des Anmeldevorgangs.

Verwenden Sie dieses Ereignis für Aufgaben, die vor Beginn des Authentifizierungsvorgangs ausgeführt werden müssen.

Authenticate

Dieses Ereignis wird nach dem LoggingIn-Ereignis ausgelöst.

Verwenden Sie dieses Ereignis, um das Standardauthentifizierungsverhalten eines Login-Steuerelements zu überschreiben oder zu erweitern.

LoggedIn

Dieses Ereignis wird nach der Authentifizierung von Benutzername und Kennwort ausgelöst.

Verwenden Sie dieses Ereignis, um eine Weiterleitung zu einer anderen Seite auszuführen oder um den Text im Steuerelement dynamisch festzulegen. Dieses Ereignis wird nicht ausgelöst, wenn ein Fehler auftritt oder die Authentifizierung fehlschlägt.

LoginError

Dieses Ereignis wird ausgelöst, wenn die Authentifizierung nicht erfolgreich war.

Verwenden Sie dieses Ereignis, um einen Text im Steuerelement festzulegen, der das Problem erläutert, oder um den Benutzer auf eine andere Seite zu leiten.

Siehe auch

Konzepte

Ereignismodell für ASP.NET-Webserversteuerelemente

Seiten- und Anwendungskontext in ASP.NET-Webanwendungen

Übersicht über den ASP.NET-Ansichtszustand

Binden an Daten mit einem Datenquellensteuerelement

Referenz

Überprüfen der Benutzereingabe in ASP.NET-Webseiten

Übersicht über ASP.NET-Anmeldungssteuerelemente

Weitere Ressourcen

Entwickeln von benutzerdefinierten ASP.NET-Serversteuerelementen

Syntax von ASP.NET-Seiten

Serverereignisbehandlung auf ASP.NET-Webseiten