[C#] Levenscyclus ASP.NET pagina

Bij het laden van een ASP.NET pagina treden er verschillende events op.

Stap 1: Genereer de gecompileerde class
De eerste stap van de levenscyclus is het genereren van een gecompileerde class die de aangevraagde pagina voorsteld. Zoals je weer bestaat een ASPX pagina uit een combinatie van een HTML en Server controls. Een dynamisch gecompileerde class is gegenereerd dat deze ASPX pagina representeerd. Deze gecompileerde class wordt dan opgeslagen in de "Tijdelijke ASp.NET bestanden" map. Zolang de ASPX pagina niet wordt aangepast worden toekomstige aanvragen voor deze ASPX pagina aangeboden door dezelfde gecompileerde class. Deze gecompileerde class bevat eigenlijk de geprogrammeerde definitie van de controls die zijn gedefinieerd op de ASPX pagina.

PreInit(nieuew in ASP.NET 2.0)
De levenscyclus van een pagina begint met het PreInit event. Dit is het enige event waar toegang (via code) tot master pages en themes zijn toegestaan. Dit event is niet recursief, dit betekent dat enkel de pagina zelf toegankelijk is en niet de child controls die erop liggen.

Init
Na de PreInit vind het Init (initialisatie) event plaats. Het Init event wordt recursief aangeroepen, voor de pagina zelf en alle child controls in de hierarchie. Het event wordt wordt afgevuurd op een onder-naar-boven manier. Dit betekent dat dit event voor het eerst wordt afgevuurd voor het control dat onderaan de hierarchie staat en zo naar boven gaat totdat het de pagina heeft bereikt. Dit gedrag kan eenvoudig getest worden door een control op een pagina te zetten. Override de OnInit event handler van zowel de pagina als de control en zet breakpoints neer op beide event handlers. Veroorzaak een postback en je zult zien dat de event handler voor het control eerst afgaat en vervolgens pas die van de pagina.

InitComplete (nieuw in ASP.NET 2.0)
Dit event geeft het einde van de initialisatie aan. Aan het begin van dit event wordt tracking aangezet door ASP.NET voor de ViewState. De StateBag class heeft een tracking mogelijkheid welke standaard uit staat en aangezet wordt door de TrackViewState() methode. Wanneer tracking eenmaal aanstaat kan deze niet meer uitgezet worden. Vanaf nu wordt elke verandering gemarkeerd als 'dirty'.

LoadViewState
Dit event wordt enkel afgevuurd bij postbacks. Dit is een recursief event, net zoals het Init event. In dit event wordt de ViewState (welke is opgeslagen in de __ViewState tijdens het vorige pagina bezoek, via het SaveViewState event) geladen en vervolgens gevuld in de control hierarchie.

LoadPostbackdata
Dit event wordt enkel afgevuurd bij postbacks. Dit is een recursief event, net zoals het Init event. Tijdens dit event wordt de geposte form data in de bijbehorende controls geladen. Stel dat je een textbox control in je form heb zitten, je vult wat tekst in vervolgens op submit druk. De ingevulde tekst wordt postback data genoemd. Deze tekst wordt geladen tijdens het LoadPostbackdata event. Een veelvoorkomende foute gedachte is dat de ViewState verantwoordelijk is voor het behouden van geposte data. Dite klopt niet; de ViewState heeft daar niks mee te maken. Om dit te bewijzen schakel dan de ViewState uit op de textbox, of de gehele pagina, en je zal zien dat dat de geposte data is behouden. Dit komt door het LoadPostbackdata event.

PreLoad(nieuw in ASP.NET 2.0)
Dit event geeft het einde van de initialisatie op systeem niveau aan.

Load
Dit is een recursief event, net zoals het Init event. Belangrijk om op te merken over dit event is het feit dat in deze stage van de pagina cyclus, de pagina teruggezet is naar de vorige status in het geval van postbacks. Dit komt doordat de LoadViewState en LoadPostbackdata events reeds zijn uitgevoerd. Dit houdt in dat de pagina ViewState en postback data nu overgedragen zijn aan de pagina controls.

RaisePostbackEvent
Dit event wordt enkel afgevuurd bij postbacks. Dit event inspecteert alle child controls op de pagina en bepaald of zij een postback event moeten kunnen afvuren. Als het zulke controls vind dan worden deze event afgevuurd. Stel je heb een button control en je klik op deze knop die een postback veroorzaakt, dan inspecteert RaisePostbackEvent de pagina en ziet dat de button een postback heeft veroorzaakt. Nu wordt de button's click event afgevuurd.

LoadComplete (nieuw in ASP.NET 2.0)
Dit event geeft het einde van het laden aan.

Prerender (nieuw in ASP.NET 2.0)
Dit event maakt het mogelijk om laatste updates door te voeren voordat de pagina wordt gerendered.

PreRenderComplete (nieuw in ASP.NET 2.0)
Dit event geeft het einde van Prerender aan.

SaveViewState
Dit event is recursief, net zoals het Init event. Tijdens dit vent wordt de ViewState gemaakt en geserialiseerd in het verborgen veld __ViewState.

SaveStateControl(nieuw in ASP.NET 2.0)
Status Control is een nieuwe eigenschap van ASp.NET 2.0. In ASP.NET 1.1 werd de ViewState gebruikt om twee soorten status informatie op te slaan voor een control:

1. Functionaliteit status
2. UI status

De resulteerde in en redelijk groote __ViewState veld. Een goed voorbeeld is de DataGrid control. In ASP.NET 1.1 gebruikt de DatGrid de ViewState om de UI status op te slaan zoals sorteren en paginering. Dus zelfs als de ViewState was uitgeschakeld en de data source rebind bij elke postback, kopn dat niet als de DataGrid gebruik maakte van sorteren of paginering. Het resultaat was dat de DataGrid eindigde met een ViewState waarin de gebonden data en de UI in opgeslagen zijn.

In ASP.NET 2.0 is dit probleem opgelose door de ViewState in tweëen te delen.

1. De ViewState zoals deze nu wordt besproken
2. De Control Status

De Control Status wordt gebruikt om de UI status in op slaan zoals de sortering en paginering van een DataGrid. In dit geval kan veilig de ViewState op false worden gezet en de paginering en sortering blijven werken, omdat deze dus ergens anders zijn opgeslagen.

De Control Status wordt ook geserialiseerd in dezelfde __ViewState veld. De Control Status kan niet worden uitgezet.

Render
Dit is een recursief event, net zoals Init. Tijdens dit event wordt de HTML gegenereerd die naar de client wordt opgestuurd.

Unload
Dit is een recursief event, net zoals Init. Het event de pagina uit het geheugen en geeft gebruikte resources vrij.

Bron: http://www.codeproject.com/KB/aspnet/aspnetviewstatepagecycle.aspx

Reacties

Populaire posts van deze blog

[SQL Server] varchar vs nvarchar

MS Sql 70-461: Chapter 5

[C#] Class serialiseren en deserialiseren