Codebehind - död åt spagettikoden # 2
Förord
Ok, nu ska jag visa vad det egentligen är du har gjort och kanske också förklara hur det funkar. Bakgrunden är att det på webben finns två typer av kod; Dels den som körs hos klienten (HTML, JavaScript och VBScript t ex) och dels den som exekveras på servern (ASP t ex). I .NET har det tänkta ett par varv till och kommit fram till att det är smidigt om man kan dela upp koden i två ”lager”. Ytterligare ett varv ger programmeraren möjlighet att använda allt som finns i alla klassbibliotek på servern. I grund och botten är ju en server en PC, som är lite hottad, och den kan utrustas med förmågan att komplicera kod.Innehåll
»»
»
»
»
För att fatta sig kort, den enda skillnaden i att programmera för webben mot att göra det för en distribuerbar applikation (*.exe) är på vilket sätt du visar upp informationen mot klienten. Naturligtvis finns det fler skillnader men inget som rör detta ämne. Jo, jag vet men håll med nu snälla...
Nu en liten titt på koden
Längst upp på sidan i filen SillyThing.aspx kommer du se en gul rand. I den hittar du som tredje egenskap ”CodeBehind” och att den har värdet ”SillyThing.aspx.vb”. Filen skapas automatiskt då du lägger till en fil av typen aspx, eller ett WebForm som det heter. Den fjärde egenskapen, ”Inherits”, är den klass som ligger till grund för all serverkod som gäller för sidan. Koden ärvs helt enkelt av sidan. Om du inte vet vad arv är kan det jämföras med att du i det här fallet slipper skriva all klasskod på HTML-sidan, den ärver de egenskaper och metoder som klassen har. Jämför med Public Property eller Public Function i en klassfil.
HTML-koden innehåller inga konstigheter. Först är där en rubrik följt av ett formulär. I formuläret finns en vanlig textbox och en submit-knapp. Så långt inga överraskningar men det är just attributet ”runat=server”, som kan ställa till det.
Detta attribut talar helt enkelt om att kontrollen ska kompileras och köras på servern. Utan dessa kommer funktionaliteten i koden att försvinna. Genom det här så har namngivning av dina kontroller/objekt/variabler blivit ännu viktigare än tidigare eftersom många av de värden som ska tilldelas dem kan ske på servern lika väl och då måste namngivning till.
Först vill jag bara tala om att om du valt ett annat språk att skriva i så hade filen haft en annan ändelse. T ex SillyThing.aspx.cs om du skrivit filen i C#.
Nu får du också förklaring till värdet på ”Inherits” i filen SillyThing.aspx. Längst upp står Public Class WebForm1. Detta är alltså en klass som du ser framför dig. Nästa rad hoppas jag över och ber att få rikta uppmärksamheten mot de följande tre, där en av dem bör se ut såhär:
Du känner nog igen namnet eftersom det är rubrikobjektet, det som byter innehåll beroende av tid. Eftersom den ska anropas på servern, ”runat=server”, måste den också deklareras här, vilket raden innebär.
Typen är HtmlGenericControl. En vanlig kontroll med andra ord. Det som följer innan visar kompilatorn var typen ligger eller är en del av. Jag tänker inte gå igenom klassbiblioteket så om du undrar får du leta på något annat ställe.
Deklarationen har utförts av utvecklingsverktyget men om du vill kan du pröva att deklarera en rubrik till fast med ett annat namn. Inte för att det gör någon direkt skillnad på websidan men bara för att det går. Ovanför dessa deklarationer så kan du deklarera egna variabler också, som bara ska finnas i just den här klassen.
Denna sub körs då sidan exekveras. Faktum är att varje .aspx.vb-fil blir till ett litet program som kompileras då det körs första gången och sedan exekveras snabbare. Om du tänkte på det så tog det faktiskt en stund innan sidan svarade när du körde koden första gången. Men sen gick det mycket fortare.
Längst ut till höger i deklarationen hittar du detta:
Detta kopplar ihop Page_Load med när den ska köras. Det viktiga är alltså inte att det heter Page_Load utan att den tar hand om MyBase.Load. Testa med att byta ut namnet på subben till något annat.
I deklarationen måste man också tala om vem det är som anropar (sender) och vad för argument som den händelsen får använda sig av (e).
Själva händelsekoden tar bara värdet (en integer) av vilken timme som det är nu och utvärderar det i en select case-sats. Det viktiga är att se hur texten tilldelas rubriken. Om du programmerat lite DHTML, känner du nog igen egenskapen.
Det här har att göra med den typ av fil som används. Ett sk Webform skapar automatiskt ett formulär som skickas till servern. I formuläret finns t ex en variabel som heter ”__VIEWSTATE”, som innehåller massa tecken utan någon synbar ordning. Denna identifierar sidan för servern så att rätt sida skickas till rätt klient och att den redan har visats. När användaren klickar på knappen skickas data till servern och koden SillyThing.aspx.vb körs igen. Postback håller ordning på om data just skickats till sidan. I det här fallet att någon skickat in formuläret. Om du tittar på din kompilerade sida när den laddat klart genom att välja att se koden i din webbläsare så hittar du säkert egenskapen ”__VIEWSTATE”.
Den fantastiskt trevliga egenskapen kan också användas för att t ex mata i startvärden för en sida, då den laddas första gången i ett besök av användaren. Något som i alla fall jag hade problem med att ta hand om i ASP.
Texten har i någon form av ordning försökt att visa på de stora fördelar som finns med att dela sin kod i klient- och serverkod. Jag har dessutom försökt att förklara hur det fungerar om än lite schematiskt.
Mitt tips till dig är att gå tillbaka en vända och försöka ändra i koden för att skapa ett annat beteende. Det brukar hjälpa mig att förstå hur saker och ting fungerar.
Testa lite enkla grejer som att ändra mina lite fåniga hälsningsfraser, tidsintervallen, namnet på Page_Load, eller varför inte kolla om "Response.Write" funkar.
Glöm heller inte att rösta eller tala om för mig om du hittar fel och brister i kod eller förklaringar.
/Mikael Sand
Propos AB
Nu en liten titt på koden
SillyThing.aspx
Längst upp på sidan i filen SillyThing.aspx kommer du se en gul rand. I den hittar du som tredje egenskap ”CodeBehind” och att den har värdet ”SillyThing.aspx.vb”. Filen skapas automatiskt då du lägger till en fil av typen aspx, eller ett WebForm som det heter. Den fjärde egenskapen, ”Inherits”, är den klass som ligger till grund för all serverkod som gäller för sidan. Koden ärvs helt enkelt av sidan. Om du inte vet vad arv är kan det jämföras med att du i det här fallet slipper skriva all klasskod på HTML-sidan, den ärver de egenskaper och metoder som klassen har. Jämför med Public Property eller Public Function i en klassfil. HTML-koden innehåller inga konstigheter. Först är där en rubrik följt av ett formulär. I formuläret finns en vanlig textbox och en submit-knapp. Så långt inga överraskningar men det är just attributet ”runat=server”, som kan ställa till det.
Detta attribut talar helt enkelt om att kontrollen ska kompileras och köras på servern. Utan dessa kommer funktionaliteten i koden att försvinna. Genom det här så har namngivning av dina kontroller/objekt/variabler blivit ännu viktigare än tidigare eftersom många av de värden som ska tilldelas dem kan ske på servern lika väl och då måste namngivning till.
SillyThing.aspx.vb
Först vill jag bara tala om att om du valt ett annat språk att skriva i så hade filen haft en annan ändelse. T ex SillyThing.aspx.cs om du skrivit filen i C#. Nu får du också förklaring till värdet på ”Inherits” i filen SillyThing.aspx. Längst upp står Public Class WebForm1. Detta är alltså en klass som du ser framför dig. Nästa rad hoppas jag över och ber att få rikta uppmärksamheten mot de följande tre, där en av dem bör se ut såhär:
Protected WithEvents rubrik As System.Web.UI.HtmlControls.HtmlGenericControl
Du känner nog igen namnet eftersom det är rubrikobjektet, det som byter innehåll beroende av tid. Eftersom den ska anropas på servern, ”runat=server”, måste den också deklareras här, vilket raden innebär.
Typen är HtmlGenericControl. En vanlig kontroll med andra ord. Det som följer innan visar kompilatorn var typen ligger eller är en del av. Jag tänker inte gå igenom klassbiblioteket så om du undrar får du leta på något annat ställe.
Deklarationen har utförts av utvecklingsverktyget men om du vill kan du pröva att deklarera en rubrik till fast med ett annat namn. Inte för att det gör någon direkt skillnad på websidan men bara för att det går. Ovanför dessa deklarationer så kan du deklarera egna variabler också, som bara ska finnas i just den här klassen.
Private Sub Page_Load
Denna sub körs då sidan exekveras. Faktum är att varje .aspx.vb-fil blir till ett litet program som kompileras då det körs första gången och sedan exekveras snabbare. Om du tänkte på det så tog det faktiskt en stund innan sidan svarade när du körde koden första gången. Men sen gick det mycket fortare. Längst ut till höger i deklarationen hittar du detta:
Handles MyBase.Load
Detta kopplar ihop Page_Load med när den ska köras. Det viktiga är alltså inte att det heter Page_Load utan att den tar hand om MyBase.Load. Testa med att byta ut namnet på subben till något annat.
I deklarationen måste man också tala om vem det är som anropar (sender) och vad för argument som den händelsen får använda sig av (e).
Själva händelsekoden tar bara värdet (en integer) av vilken timme som det är nu och utvärderar det i en select case-sats. Det viktiga är att se hur texten tilldelas rubriken. Om du programmerat lite DHTML, känner du nog igen egenskapen.
If IsPostBack?
Det här har att göra med den typ av fil som används. Ett sk Webform skapar automatiskt ett formulär som skickas till servern. I formuläret finns t ex en variabel som heter ”__VIEWSTATE”, som innehåller massa tecken utan någon synbar ordning. Denna identifierar sidan för servern så att rätt sida skickas till rätt klient och att den redan har visats. När användaren klickar på knappen skickas data till servern och koden SillyThing.aspx.vb körs igen. Postback håller ordning på om data just skickats till sidan. I det här fallet att någon skickat in formuläret. Om du tittar på din kompilerade sida när den laddat klart genom att välja att se koden i din webbläsare så hittar du säkert egenskapen ”__VIEWSTATE”. Den fantastiskt trevliga egenskapen kan också användas för att t ex mata i startvärden för en sida, då den laddas första gången i ett besök av användaren. Något som i alla fall jag hade problem med att ta hand om i ASP.
Avslutningsvis
Texten har i någon form av ordning försökt att visa på de stora fördelar som finns med att dela sin kod i klient- och serverkod. Jag har dessutom försökt att förklara hur det fungerar om än lite schematiskt. Mitt tips till dig är att gå tillbaka en vända och försöka ändra i koden för att skapa ett annat beteende. Det brukar hjälpa mig att förstå hur saker och ting fungerar.
Testa lite enkla grejer som att ändra mina lite fåniga hälsningsfraser, tidsintervallen, namnet på Page_Load, eller varför inte kolla om "Response.Write" funkar.
Glöm heller inte att rösta eller tala om för mig om du hittar fel och brister i kod eller förklaringar.
/Mikael Sand
Propos AB
0 Kommentarer