Låt aspx-sidan ärva från en basklass
Förord
När man skall bygga en ny site finns det så många saker att tänka på att man inte alltid vet vart man skall börja. Det finns tonvis med information på nätet och man samlar länkar till förbannelse. Jag tänkte i en kort artikel ta upp en av alla dessa tips som är bra att tänka på när man börjar bygga en ny site.Innehåll
»»
»
»
»
»
»
Relaterade artiklar
Förord
Tänk dig att du har en hemsida som består av en massa aspx sidor och du mitt i arbetet får för dig att du skulle behöva några funktioner och rutiner som dels alltid är nåbara på sidan, utan att behöva skriva någon klass och använda massa namespace. En annan sak skulle exempelvis vara att du på varje sida behöver kontrollera om användaren är inloggad, eller kanske att du vill skriva ner till databasen vilken sida en användare besöker för att göra statistik på hur många besökare varje sida har.Som du ser finns det många frågor redan initiellt som kan vara intressanta att få svar på. I detta fall är just alternativet att ärva från en basklass som du använder. Vi går därför in på detaljer hur detta skulle kunna gå till.
Vi börjar med aspx-sidan
När du skapar en ny aspx-sida, oavsett om det är c# eller vb så kommer i code-behind sidans kod att presentera följande:
Public Class defaultabout
Inherits System.Web.UI.Page
Den koden känner du säkert igen. Vad som händer här är egentligen att vi hämtar upp och sätter referensen till page-klassen så man kan använda de rutiner och funktioner som finns att tillgå för just den kod som skrivs på aspx.vb-sidan, dvs code behind.
Det vi kan göra är att vi ärver från en klass som är en helt vanlig klass som vi själva skriver och med denna teknik får vi möjligheter att skriva egna rutiner. Vi går vidare för att skriva en sådan klass.
Skriv en egen bas-klass
Enklast är att skapa en ny klass-fil. Detta gör du genom att högerklicka på ditt webbprojekt och från den menyn väljer 'add' och därefter 'add class'. Du får nu en fil som du kan döpa till pagebase.vb. I denna filen står inget annat än just att klassen heter pagebase.
Public Class pagebase
End Class
Det vi skall göra nu är att i denna klass göra precis samma sak som varje codebehind sida gör, nämligen ärva page-klassen, så vi lägger till denna kod.
Public Class pagebase
Inherits System.Web.UI.Page
End Class
Nu har vi en klass som heter pagebase, denna klass ärver från UI.Page vilket gör att den kod som står på code behind sidan blir onödig, men en sak måste göras till. Vi måste på code-behind sidan ersätta Inherits och faktiskt ärva från pagebase istället för UI.Page. I mitt exempel så döpte jag min solution till artikar, så därför måste jag ange detta även i koden. Så här ser det ut då:
Public Class WebForm1
Inherits artiklar.pagebase
Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
'Put user code to initialize the page here
End Sub
End Class
Vad innebär detta?
Som ni ser nu så när programmet körs, kommer alltså klassen pagebase att köras. Ingenting kommer hända just nu, men om vi nu lägger in en subrutin -new() och sätter en break på den så kommer ni se att innan sidan visas så kommer programmet stanna just i denna klass.
Public Class pagebase
Inherits System.Web.UI.Page
Public Sub New()
End Sub
End Class
Med detta vill jag bara visa att vi faktiskt skrivit en rutin som gör att den eller de aspx-sidor du vill kommer köras varje gång någon besöker en specifik sida. Här kanske du nu börjar se möjligheterna att faktiskt börja skriva rutiner som bara behöver förekomma på ett enda ställe, vilket är vårt mål.
Vi går vidare, vad kan vi göra mer?
Funktioner som nås utan namepace
Om vi tar ett exempel att vi vill kontrollera om användaren är inloggad så kanske vi skriver en klass som kan användas, men i detta fall är det en funktion som jag bara vill nå på sid-nivå, alltså inte i andra klasser eller rutiner. Det kanske inte är det bästa exemplet men visar i alla fall att man kan göra det. Ett klokare exempel kanske är att logga till databasen vilken sida man kör och skriver ner det till databasen, men vi börjar med en enkel rutin så länge.
Public Class pagebase
Inherits System.Web.UI.Page
Public Sub New()
End Sub
Public Function IsLoggedIn() As Boolean
' är användaren inloggad?
If Session("userid") > 0 Then
' inloggad
Return True
Else
' inte inloggad
Return False
End If
End Function
End Class
Om ni nu skall nå denna rutin från vår codebehind sida behöver vi inte ange något namespace utan kan använda funktionen direkt, exempelvis såhär:
Public Class WebForm1
Inherits artiklar.pagebase
#Region " Web Form Designer Generated Code "
'This call is required by the Web Form Designer.
Private Sub InitializeComponent()
End Sub
'NOTE: The following placeholder declaration is required by the Web Form Designer.
'Do not delete or move it.
Private designerPlaceholderDeclaration As System.Object
Private Sub Page_Init(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Init
'CODEGEN: This method call is required by the Web Form Designer
'Do not modify it using the code editor.
InitializeComponent()
End Sub
#End Region
Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
'Put user code to initialize the page here
If IsLoggedIn() = False Then
Response.Redirect("/login.aspx")
End If
End Sub
End Class
När skall jag använda detta?
Som du kanske förstått av artikeln så handlar det om att istället för att på varje sida skriva massa funktioner eller kod som skall köras. Att i stället ärva från en basklass kan du skriva rutinerna där och kommer köras varenda gång användaren besöker sidan. Alternativet hade varit att skriva anrop till funktioner på varje code-behind sida, nu behöver du alltså inte det. Det enda du behöver göra är alltså att se till att du på din code-behind sida ärver från basklassen istället för UI.Page så får du tillgång till dessa rutiner. Jag tror att när du funderat en stund så ser du att det finns massa rutiner du skulle kunna lägga upp där, likaså nyttja för allehanda roliga rutiner och funktioner.
Pelle Johansson
Har du använt denna teknik och har förslag eller synpunkter. Kom gärna med kommentarer.
Magnus Gustafsson
Vi har skapat en basklass som har som uppgift att kontrollera vilken användare som är inloggad och sedan kolla i databasen om en användare har admin-rättigheter i applikationen. Alla aspx-sidor i asministrationsdelen ärver sedan från denna basklass, väldigt användbart. Ngn som har tips på fler funktioner som passar bra att lägga i en basklass?
Simon Karlsson
Kan tillägga att med en: Private Sub MyBaseLoad(ByVal s As Object, ByVal e As EventArgs) Handles MyBase.Load ---Din kod end sub så kan baseclass även användas som en header. Session, request, response blir tillgängligt.
Dick Andersson
Kan denna metod appliceras på usercontrols åxå?? Ex i min BaseClass.cs har jag en funktion för att skapa en DBconnection, denna ska användas i ett antal av mina Usercontols. Går det då att från ascx filen ärva så att man får samma funktionalitet som i ditt IsLoggedIn() exempel??
Pelle Johansson
Hej Dick, ja det kan den - dock ärver en usercontrol från Inherits System.Web.UI.UserControl så du får se till att din egna klass också gör det då
Dick Andersson
Ahh, så jag bör göra en baseclass specifik för usercontrols som ärver från System.Web.UI.UserControl? Jag har sen tidigare en baseclass.cs som mina codebehind ärver ifrån.
Pelle Johansson
tycker jag låter bra. sen kan ju den ärva page också förstås
Nyligen
Sidor
Statistik
Antal medlemmar:
Antal inlägg:
Online:
På chatten:
27 926
260 274
389 230
0
Kontakta oss
Frågor runt konsultation, rådgivning, uppdrag, rekrytering, annonsering och övriga ärenden. Ring: 0730-88 22 24 | pelle@pellesoft.se