Grundkurs asp.net del 3 - kontroller
Förord
I det förra kapitlet gick vi genom vad ett Web Form är för något. Vi såg att det är ett kopilerat program, vilket kör på servern och använder en HTML-sida som sitt gränssnitt. Den HTML-sidan är det enda som skickas till klienten. De serverkontroller som (troligen) används i Web Formen kör alltså enbart på servern. Vi tittade på ett par av de webbkontroller som finns med 'out-of-the-box' i .NET/ASP+, t ex TextBox och RequiredFieldValidator. Slutligen använde vi dessa kontroller (och ett par till) för att skapa en enkel inloggningssida.
Ytterligare webbkontroller
Det finns som sagt en hel drös med webbkontroller som standard i ASP+. De grundläggande är självklart de som har en motsvarighet i ett HTML formulär, t ex <input type="...">, <select> osv. Vi såg i det förra kapitlet exempel på hur dessa hör ihop, t ex hur man genom att endast lägga till attributet Mode="Password" på en TextBox fick den att bete sig som en <input type="password">-kontroll. Ett annat alternativ är <asp:TextBox runat="server" Mode="Multiline" />, vilket gör att kontrollen skapar en <textarea>-kontroll i HTML sidan som skickas till klienten.Ännu intressantare blir kontrollerna när man verkligen utnyttjar objekt-orienteringen i dem. T ex finns det en abstrakt basklass (betyder ungefär en klass som inte går att skapa, utan används istället som en gemensam grund för andra klasser som ärver från den) som heter ListControl. Under den finns fyra klasser som alla ärver direkt från den. Dessa är DropDownList, ListBox, CheckBoxList och RadioButtonList. Nedan finns ett exempel på hur lika dessa är varandra. Efter koden visas resultatet av den webbkontrollen.
Val #1
Val #2
Notera hur lik koden är för dessa kontroller, men hur olika resultatet blir. Deras innehåll (i form av <asp:ListItem>-taggar) ser fungerar likadant för bägge kontrollerna, pga att de ärver dem från ListControl-klassen. På liknande sätt finns det andra exempel på hur kontroller ärver (och förändrar) funktionalitet från varandra. T ex så ärver RadioButton klassen direkt från CheckBox klassen, likaså ärver ImageButton (alltså motsvarigheten till en <input type="image">) direkt från Image (motsvarigheten till en <img>).
Hittills har vi endast sett exempel på webbkontroller som skapar formulärkontroller (samt Image som skapar en <img>-tagg). Det finns dock inget som säger att en kontroll inte kan skapa mer än en HTML-tagg. Ett bra exempel är Calendar kontrollen. (Punkterna ska självklart bytas ut mot lite mer kod)
...
Som synes skapar Calendar kontrollen en tabell, med ett utseende som kan förändras helt och hållet med hjälp av några attribut. En webbkontroll skapar alltså flera HTML-taggar. Utvecklaren behöver inte själv skapa de 42 tabellcellerna med valbara datum, och inte heller de framåt/bakåt länkar som används för att navigera en månad fram eller bak. Allt detta finns 'inbakat' i Calendar klassen, och allt utvecklaren behöver göra är att deklarera en kontroll på ett Web Form och sätta de attribut som behövs för att kalendern ska få det önskade utseendet.
Uplevel/downlevel browsers
Vi har dock inte sett det mest intressanta än. I kapitel 2 berättade jag att alla webbkontroller (eftersom de ärver från klassen WebControl) har funktionalitet att automatiskt känna igan besökarens browser, samt vilken funktionalitet den stöder. T ex kan kontrollen se om klienten stöder cookies, om (och vilken version av) JavaScript kan köras, om klienten stöder XML eller ej samt om DHTML (dvs om man kan påverka innehållet och utseendet på en webbsida direkt på klienten, utan att hämta om sidan från servern) stöds i klienten. I version 1 av ASP+ kommer detta antagligen att förenklas i form av indelningen i s k Uplevel- eller Downlevel-browsers. Enkelt sett räknas IE5 och högre som uplevel, och övriga browsers räknas som downlevel. Detta är dock bara en standardinställning som är enkel att ändra, så att man kan välja att t ex Netscape 6 (när den kommer) ska räknas som uplevel.
Detta utnyttjas bl a i Calendar kontrollen. Det finns som sagt två länkar för att bläddra framåt och bakåt en månad i kalendern. Om en besökare med t ex IE 3.02 (downlevel) skulle besöka sidan så skulle ett klick på framåt/bakåt länkarna skicka en begäran till servern om att ladda om sidan, med rätt månad vald. För en besökare som använder IE 5.5 skulle sidan däremot inte bete sig likadant. När man klickar på 'länken' skulle istället ett JavaScript köras på klienten, vilket skulle 'rita om' kalendern med rätt månad, utan att ladda om sidan från servern.
Egenutvecklade kontroller
Webbkontroller gör det enkelt för utvecklare att skapa egna kontroller. Dels kan man skapa egna, specialiserade versioner av de existerande kontrollerna, dels kan man skapa helt nya kontroller. En enkel kontroll skapas så här:
Imports System
Imports System.Web.UI
Namespace HedgateCommonControls
Public Class BoldNameCtl Inherits Control
Overrides Sub Render (Writer As HtmlTextWriter)
Writer.Write("Christoffer Hedgate")
End Sub
End Class
End Namespace
Denna kontroll kompileras till en dll, och används sedan i ett Web Form så här:
<%@ Page Language="VB" %>
<%@ Register TagPrefix="hedgate" Namespace="HedgateCommonControls" %>
Min egen kontroll
Hur HTML-sidan som blir resultatet av detta Web Form ser ut kan ni nog själva gissa...
Ovanstående är ett exempel på en kompilerad kontroll. Om man utvecklar och säljer kontroller så distribueras de på det sättet. Om man endast ska använda en kontroll själv, eller om man inte bryr sig om andra får källkoden till de kontroller man skapat, så kan man istället skapa en s k pagelet. En pagelet är en samling html-text, taggar och även andra serverkontroller som sparas i en fil med ändelsen .aspc. Det är alltså i princip samma sak som en vanlig ASP+ sida (*.aspx), men den går inte att köras för sig själv i en klient utan inkluderas istället i 'riktiga' Web Forms (.aspx). På så sätt kan man enkelt återanvända inte bara information utan även ett utseende.
Ett bra användningsområde för detta kan t ex vara den klassiska navigeringsmenyn, som består av ett antal länkar (<a href=...>), radbrytningar mellan dem (<br>) samt kanske en bild/logga (<img src=...>) för siten. Samma meny används på alla sidor, och ska man lägga till en länk får man göra det på alla sidor, om man inte gjort en #include vilket inte är riktigt bra prestandamässigt sett. Denna meny kan då skapas som en pagelet, vilken sedan läggs in i sitens Web Forms som en 'vanlig' serverkontroll (se exempel nedan). Detta kommer inte att påverka prestandan, därför att pagelets kompileras tillsammans med resten av Web Formen till ett program som körs på servern, vilket skapar en HTML-sida som output till klienten.
<%@ Register TagPrefix="hedgate" Namespace="HedgateCommonControls" src="NavigationMenu.aspc" %>
Som ni säkert har gissat skulle detta skapa en HTML sida med den meny som definierats i en pagelet.
Sammanfattning kapitel 3
I kapitel 3 har vi tittat vidare på vilka webbkontroller som finns att utnyttja i ASP+. Vi har även sett hur enkelt man kan göra egna kontroller, och ni inser säkert vilka möjligheter man har här. I nästa kapitel ska vi se på vad man kan göra med ASP+ applikationer, inte bara enstaka sidor. Vi ska t ex titta lite på hur enkelt man kan adminstrera dessa.
Kursen är även publicerad på Hedgate.NET.
Var denna artikeln användbar?
Om du gör någon intressant som grund av detta material så skicka gärna det med ett mail eller bifoga en länk till mig så presenterar jag detta som ytterligare exempelfiler för kursen. Om detta innehållet är felaktigt eller du lärt dig fler finesser så skriv gärna en rad eller varför inte en egen kurs baserat på dina erfarenheter. Sänd gärna in kommentarer till denna kurs./Christoffer Hedgate
Obs! Detta dokument innehåller fel i img-taggar, en sluttagg saknas. Vänligen korrigera dessa!
Obs! Detta dokument innehåller fel i html-taggar, en sluttagg saknas. Vänligen korrigera dessa!
0 Kommentarer