ASP.net : ASP.net pagina's in detail

  1. Inleiding
  2. Een pagina uitvoeren
  3. System.Web.UI.Page: overzicht
  4. De eigenschap Request
  5. De eigenschap Response
  6. De eigenschap IsPostBack
  7. De eigenschap Context
  8. De eigenschap Server
  9. Page Directives

Inleiding

Je hebt reeds kennis gemaakt met formulieren en ook met een aantal basisfunctionaliteiten van de System.Web.UI.Page-klasse, de klasse waarvan elke webpagina een object vormt wanneer die uitgevoerd wordt.
In dit hoofdstuk gaan we dieper op deze klasse in.

Een ASP.Net pagina uitvoeren

Compilatie

ASP.net pagina's worden dynamisch gecompileerd wanneer ze de eerste keer worden opgevraagd. Dit gebeurt in een WebServer (IIS) in de context van een Web applicatie.
Dynamische compilatie is niet specifiek voor ASP.net pagina's (.aspx), maar geldt ook voor .Net Web Services (.asmx), Web User Controls (.ascx), HTTP handlers (.ashx), een nog een aantal, zoals global.asax (meer hierover later).
Een pipeline van modules zorgt ervoor dat de code die je hebt geschreven voor het maken van een ASP.Net webpagina evolueert naar een ASP.Net object, meer bepaald een instantie van een klasse afgeleid van de Page klasse.
De ASP.NET HTTP runtime verwerkt het Page-object en zorgt ervoor dat het de opmaak genereert als response naar de browser. Dit opmaken van de response gebeurt in een cyclus die we de levenscyclus (life cycle) van de pagina noemen.

System.Web.UI.Page: overzicht

ASP.net pagina's uitvoeren

Wanneer een browser een ASP.NET pagina opvraagt herkent IIS de aspx-extensie en laat de ASP.NET module aspnet_isapi.dll de vraag verder afhandelen. De aspnet_isapi.dll plaatst het aspx-bestand in een nieuwe klasse-definitie in de namespace ASP. Mijnpagina.aspx wordt een ASP.mijnpagina_aspx klasse. Deze klasse erft van de Page klasse uit de System.Web.UI namespace. Elke ASP.NET webpagina die wordt opgevraagd wordt in feite gecompileerd tot een klasse die erft van de .NET Page-klasse en dus alle functionaliteit van deze klasse kan gebruiken.

Events bij het uitvoeren van ASP.net pagina's

ASP.NET is event-driven : code wordt uitgevoerd wanneer bepaalde acties worden ondernomen. Deze acties worden gestart door een gebruiker of automatisch binnen het .NET Framework.

De volgorde waarin events uitgevoerd worden bij het laden van elke pagina noemen we de life cycle:

Event Omschrijving
Page Setup Hier wordt een tree van controls opgebouwd en gedetecteerd waarom de pagina moet uitgevoerd worden: een normaal request, een postback, een cross-page postback of een callback. De collectie gegevens ontvangen via POST of GET wordt voorbereid. Na deze stap kunnen we op events sturen naar de eventhandlers in de broncode.
PreInit Geïntroduceerd in ASP.Net 2.0: het beginpunt in de levenscyclus van een pagina. Wanneer dit event wordt uitgevoerd zijn nog geen masterpage of theme geassocieerd. De scroll-positie is gekend, geposte data is beschikbaar en de controls werden geïnitialiseerd met de eigenschappen zoals opgegeven in de aspx-broncode. Controls hebben geen ID als dit niet in de aspx-code is opgegeven. Masterpage of theme opgeven is vanaf nu mogelijk via code. IsPostBack, IsCrossPagePostBack en IsCallBack worden hier ingesteld.
Init Masterpage en theme zijn ingesteld en kunnen niet meer worden veranderd. Alle child controls zien hun OnInit methode uitgevoerd. De ViewState is nog niet herzet.
InitComplete Geïntroduceerd in ASP.Net 2.0: controls halen hun ViewState op. Alles wat voor dit event in de ViewState geschreven is zal verloren gaan bij de volgende PostBack
PreLoad Geïntroduceerd in ASP.Net 2.0: enkel voor pagina's: aangeven dat de pagina de systeemniveau-initialisatie heeft voleindigd en nu de aandacht kan geschonken worden aan de gebruikerscode
Page_Load Eerst uitgevoerd voor de pagina, daarna voor alle controls. Wanneer de pagina geladen is, de __Viewstate is nu volledig geladen en kan zonder probleem benaderd worden.
PostBack afhanelen Het PostBack-mechanisme is het hart van ASP.Net programmeren. Het bestaat uit het versturen van formuliergegevens naar dezelfde pagina en het gebruiken van de viewstate om de oproepcontext te construeren.
Control Event Wanneer een control een event heeft geraised, zoals wanneer een druk op een knop de pagina heeft herladen
LoadComplete Geïntroduceerd in ASP.Net 2.0: enkel voor de pagina: duidt het einde aan van de paginavoorbereidingsfase, hierna wordt de pagina afgewerkt: Page Rendering
Pagina-afwerking De pagina is klaar om output naar de browser te sturen
PreRender Pagina's en Controls kunnen hier updates ondergaan vooraleer de output wordt gegenereerd
PreRenderComplete Geïntroduceerd in ASP.Net 2.0: geeft aan dat de PreRender-fase voor alle controls voleindigd is
SaveStateComplete De nieuwe toestand van de controls wordt opgeslagen in de viewstate
Page_Unload Wanneer de pagina uit het server-geheugen wordt gehaald, eerst voor alle controls, daarna voor de pagina.

De eigenschap Request

Wanneer een browser een request voor een pagina geeft, wordt de informatie die de browser naar de server stuurt netjes door het .NET Framework gebundeld in een HttpRequest.
Dit object kan je vanuit de Page-klasse aanspreken met de eigenschap Request.

De request informatie kan je gebruiken om informatie te weten over de browser, cookie-informatie op te vragen,...

De eigenschap Response

Het Page-object dat we maken door een aspx-pagina op te vragen heeft een eigenschap Response. Deze eigenschap bevat in feite een object van de klasse HttpResponse. Dit object heeft een aantal interessante methoden en eigenschappen:

De eigenschap IsPostBack

Deze eigenschap van de klasse Page bevat een Boolean waarde die aangeeft of de pagina werd teruggepost naar de server. Hiermee kan je controleren of een pagina voor het eerst wordt getoond of er reeds een terugpost naar de server is geweest doordat de gebruiker bv. op een knop heeft gedrukt.
Deze eigenschap zal in de rest van de cursus vaak worden gebruikt.

Voorbeeld

In dit voorbeeld wordt een ArrayList gebruikt om een ListBox te vullen. We zorgen er voor dat deze ArrayList slechts één keer gebruikt wordt om de ListBox te vullen : de eerste keer dat de pagina wordt getoond. Wanneer de gebruiker de pagina verstuurd gebreurt een postback, de formulierelementen behouden hun 'state' door het verborgen Viewstate - formulierveld. Hierdoor hoef je de ArrayList geen tweede keer te gebruiken.

Deze techniek zal vaak aangewend worden wanneer keuzelijsten e.d. gevuld worden met gegevens uit een database. Zo is er slechts één keer een dataconnectie nodig.

IsPostback.aspx
...
<form id="form1" runat="server">
<div>
    <asp:ListBox ID="LBdieren" runat="server" AutoPostBack="True"></asp:ListBox>
    <br />
    <br />
    <asp:Label ID="LblKeuze" runat="server" Text="Label"></asp:Label>
</div>
</form>
...

IsPostback.aspx.cs
...

protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            ArrayList dieren = new ArrayList();
            dieren.Add("Kat");
            dieren.Add("Hond");
            dieren.Add("Aap");
            dieren.Add("Ezel");
            dieren.Add("Giraf");

            dieren.Sort();

            LBdieren.DataSource = dieren;
            LBdieren.DataBind();
        }
        else
        {
            LblKeuze.Text = "Je koos een " + LBdieren.SelectedItem.Text;
        }

    }

De eigenschap Context

De eigenschap Context bevat alle http-informatie aangaande een http-request. De eigenschap Context bevat een instantie van de klasse System.Web.HttpContext. Dit object heeft een aantal interessante members.

De eigenschap Context kan je gebruiken om informatie bij te houden wanneer de gebruiker naar een andere pagina wordt gestuurd. Niets is vervelender voor jouw als programmeur en voor de gebruiker dat dezelfde informatie meermaals moet worden verstrekt.

member omschrijving
Session Bevat een HttpSessionState-object waarmee je informatie van een bepaalde gebruiker (sessie) kan bewaren. Je kan de informatie per gebruiken in key/value paren.
Application evat een HttpApplicationState-object waarmee je informatie voor alle gerbuikers kan bewaren. Je kan de informatie in key/value paren opslaan.
Items Collectie met key/value paren die informatie bewaren van alle componenten die deelnemen in één http-request. Deze collectie is dus slechts gekend gedurende één request van de gebruiker. Met Server.Transfer kan je de gegevens wel meegeven. Klikt de gebruiker echter op een hyperlink of ga je met Response.Redirect naar een andere pagina van de site, dan gaat deze informatie verloren.
Handler Levert je informatie over de pagina die opgevraagd wordt, maar stelt je ook in staat om informatie over de aanvrager op te vragen na bijvoorbeeld Server.Transfer
Trace Geeft je de mogelijkheid het uitvoeren van je toepassing te traceren en te zien waar 'bottlenecks' zich bevinden

In het bestand Global.asax kan je code schrijven voor onder meer volgende event-handlers:

event-handler omschrijving
Application_Start Wordt uitgevoerd wanneer de applicatie wordt opgestart: onze toepassing voorbereiden op het ontvangen van requests, zoals databaseconnecties openen, applicatievariabelen instellen, ...
Session_Start Wanneer een sessie start: een gebruiker betreedt de site
Session_End Een gebruiker verlaat de toepassing
Application_End De applicatie wordt afgesloten
Application_BeginRequest Bij elke request
Application_EndRequest Na elk request
Application_Error Afhandelen van onverwachte fouten

Het bestand Global.asax moet zich in de root van de virtuele map in IIS bevinden.

Voorbeeldtoepassing

We maken een kleine toepassing die het werken met contextitems, sessievariabelen en applicatievariabelen demonstreert.

We maken een aspx pagina waarin we in het Load-event van het formulier een contextitem-, twee sessievariabelen en een applicatievariabele vulllen.

We voorzien ook twee knoppen, bij het klikken op een knop wordt de gebruiker doorgestuurd naar een andere pagina. Het doorsturen gebeurt een keer met Response.Redirect en een keer met Server.Transfer (zie volgend onderdeel in de cursus).

Op de tweede pagina plaatsen we vier labels die de inhoud van deze variabelen moeten tonen. We gaan telkens na of er een fout optreedt.


Met Server.Transfer


Met Response.Write

Toon /verberg code

Je merkt dat bij het versturen met Response.Write de informatie in contextitems niet meer wordt onthouden.

Uit deze toepassing valt het verschil tussen sessie- en applicatievariabelen niet uit te maken. Onthoud dat sessievariabelen een set variabelen vormen voor elke individuele user, applicatievariabelen vormen een set gemeenschappelijke variabelen voor alle gebruikers.

De eigenschap Server

De eigenschap Server van de klasse Page bevat een object van de klasse System.Web.HttpServerUtility waarmee je toegang hebt tot een arsenaal aan interessante eigenschappen en methodes om de webserver te manipuleren.
member omschrijving
MapPath Retourneert het fysieke pad op de server van de huidige virtuele map. Kan handig gebruikt worden voor het openen en opslaan van bestanden op de server
HtmlEncode Encodeert een string voor weergave in een browser
Transfer Beëindigt de uitvoering van de huidige pagina en begint de uitvoering van een andere pagina. In tegenstelling tot bij Response.Write kan je na een transfer wel nog aan de elementen van de bronpagina!
Execute Voer een andere pagina uit en ontvang eventueel de gegenereerde output in de huidige pagina
MachineName Retourneert de naam van de servercomputer

Voorbeeldtoepassing

In deze toepassing leer je hoe je na een Transfer aan de gegevens van de bronpagina kan opvragen. Je maakt ook kennis met de methode Execute.

Maak een pagina met daarin een TextBox en een Button. Voorzie in de codebehind-file een property Voornaam.

Bij klikken op de knop voorzie je dat de gebruiker met Server.Transfer wordt doorgestuurd naar een tweede pagina.

Op de tweede pagina kunnen we de inhoud van de TextBox en de waarde van de Property van de eerste pagina opvragen!
Daarvoor gebruiken we de eigenschap Handler van de Context (HttpContext) van de pagina. De ontvangen gegevens typecasten we naar de klasse van de originele pagina.
Een control kunnen we nu vinden met de methode FindControl
Een property kunnen we rechtstreeks aanspreken

De methode Execute staat je toe een externe pagina uit te voeren. Deze pagina kan uitvoercommando's bevatten (controles, wegschrijven in een database, ...), je kan met behulp van een TextWriter ook eventuele respons-informatie van de uitgevoerde pagina opvangen. We geven de opgevraagde waarde weer met behulp van drie Labels.

Toon /verberg

Page Directives

Wanneer een pagina gemaakt wordt kan je een aantal attributen opnemen in deze pagina. Deze attributen kan je instellen via directives. Een aantal hiervan komen later in de cursus meer in detail aan bod.
Directive Beschrijving
@Assembly Hiermee kan je een assembly in je pagina importeren (.dll-bestand)
@Control Definieert een attribuut specifiek voor een control
@Implements Stelt je in staat een interface in je webpagina te importeren. Hierdoor geef je aan dat je webpagina de in een interface gedefiniëerde eigenschappen, methoden en events zal gebruiken
@Import Hiermee kan je een namespace importeren in de pagina. Dit zorgt ervoor dat alle klassen en interfaces binnen die namespace bruikbaar zijn binnen de pagina. Het .NET Framework importeert standaar een heel aantal namespaces voor jou
@Master Identificeert een Master Page (niet beschikbaar in .Net 1.1)
@Outputcache Hiermee kan je instellen hoe de pagian gecached wordt op de server
@Page Een derictive die we al vaak hebben gebruikt is de @Page directive. Hiermee hebben we een attribuut language ingesteld om aan te geven welke .NET taal we wensen te gebruiken
@Reference Wordt gebruikt om een pagina of user control in de pagina te importeren. Op deze manier wordt de pagina of usrer control runtime gelilnked
@Register Hiermee kan je server controls die je eventueel zelf hebt ontworpen in de pagina importeren met een specifieke tag (prefix en naam)

Meer tutorials:
leer ook: html | xhtml | css | asp | asp.net | c# | ado.net | linq | ajax | java | javascript
Valid HTML 4.01! Valid CSS! © - Cursusweb