5.2 Die Code-Behind-Technologie
 
ASP.NET kompiliert jede aspx-Seite in eine Klasse, die von der Page-Klasse abstammt. Aufgrund dieses objektorientierten Ansatzes ist es möglich, eine aspx-Seite von einer selbst definierten Basisklasse abzuleiten, die ihrerseits von Page abstammt. Genau das ist die Funktionsweise der Code-Behind-Technologie.
Ein einfaches Beispiel soll das Verfahren illustrieren. Den Ausgangspunkt bildet die folgende einfache aspx-Seite, deren Darstellung im Browser Abbildung 5.3 zeigt.
<!-- codebehind_01.aspx -->
<%@ Page Language="VB" Debug="True" Strict="True" %>
<script runat="server">
Public Sub Page_Load (ByVal Sender As Object, _
ByVal E As EventArgs)
Dim s As String
s = "Heute ist der "
s &= DateTime.Now.toShortDateString()
s &= "."
lblZeit.Text = s
End Sub
</script>
<html>
<head><title>Code-Behind-Beispiel</title></head>
<body>
<h3>Code-Behind-Beispiel</h3>
<p>
<asp:Label id="lblZeit" runat="server" />
</p>
<p>Hier kommt der weitere Inhalt der Seite ...</p>
</body>
</html>
 Hier klicken, um das Bild zu Vergrößern
Abbildung 5.3 Alle aspx-Seiten sind von der Page-Klasse abgeleitete Objekte.
Beim Aufruf der Seite schreibt die Prozedur Page_Load das aktuelle Datum in das Label-Steuerelement lblZeit. Dieses Feature möchten Sie auf vielen Seiten Ihrer Website verwenden. Eine Möglichkeit neben anderen besteht darin, den erforderlichen Code in eine Code-Behind-Datei auszugliedern.
Indem Sie anschließend Ihre einzelnen Webseiten von dieser Code-Behind-Datei ableiten, können Sie den Code der Basisklasse stets wiederverwenden und auf allen Seiten erscheint das gewünschte Datum.
Zur Realisierung teilen Sie die Bestandteile von codebehind_01.aspx in zwei Dateien auf. codebehind_02.aspx enthält den HTML-Code und eine modifizierte Page-Direktive, die im Anschluss erläutert wird:
<!-- codebehind_02.aspx -->
<%@ Page Inherits="Codebehind_02_baseclass" src="codebehind_02.vb" %>
<html>
<head><title>Code-Behind-Beispiel</title></head>
<body>
<h3>Code-Behind-Beispiel</h3>
<p>
<asp:Label id="lblZeit" runat="server" />
</p>
<p>Hier kommt der weitere Inhalt der Seite ...</p>
</body>
</html>
codebehind_02.vb ist eine reine VB-Datei und enthält den Skript-Anteil mit Anpassungen im Code, die ebenfalls anschließend erläutert werden.
' codebehind_02.vb
Imports System
Imports System.Web
Imports System.Web.UI
Imports System.Web.UI.WebControls
Public Class Codebehind_02_baseclass : Inherits Page
Protected lblZeit as Label
Public Sub Page_Load (ByVal Sender As Object, _
ByVal E As EventArgs)
Dim s As String
s = "Heute ist der "
s &= DateTime.Now.toShortDateString()
s &= "."
lblZeit.Text = s
End Sub
End Class
5.2.1 Die aspx-Seite mit der Code-Behind-Datei verknüpfen
 
Bei der Datei codebehind_02.aspx stellt sich zunächst die Aufgabe, festzulegen, dass die Seite nicht von der Klasse Page direkt abgeleitet werden soll, sondern von der Klasse, die Sie selbst definiert haben. Das erreichen Sie, indem Sie die Page-Direktive entsprechend anpassen. Über das Inherits-Attribut legen Sie die Klasse fest, von der die Seite abgeleitet werden soll:
<%@ Page Inherits="Codebehind_02_baseclass" ... %>
Als Zweites stellt sich die Frage, in welcher Datei ASP.NET diese Klasse findet. Hier gibt es mehrere Möglichkeiten. Wenn Sie in der Page-Direktive dazu keine Angabe machen, sucht ASP.NET automatisch im /bin-Unterverzeichnis des Applikationsverzeichnisses. Alternativ können Sie mit dem src-Attribut ausdrücklich einen Pfad angeben. Mit der Angabe src="codebehind_02.vb" sucht ASP.NET die Datei codebehind_02.vb beispielsweise im gleichen Verzeichnis, in dem auch die aspx-Seite liegt. So wie die aspx-Seiten vom JIT-Compiler automatisch kompiliert werden, so werden auch die zugrunde liegenden Basisklassen automatisch kompiliert.
5.2.2 Die Code-Behind-Datei erstellen
 
Die Datei codebehind_02.vb enthält die Definition der Klasse Codebehind_02_baseclass. codebehind_02.vb ist eine reine VB-Datei. Hier treffen Sie nicht auf spitze Klammern, sondern ausschließlich auf VB-Code. Um den Aufbau der Klasse nachvollziehen zu können, soll sie Stück für Stück aufgebaut werden.
Sie wissen bereits, welchen Code die Klasse auf jeden Fall enthalten muss, nämlich die Page_Load-Prozedur mit der gewünschten Funktionalität. Also enthält die Klasse mindestens diesen Code:
Public Sub Page_Load (ByVal Sender As Object, _
ByVal E As EventArgs)
Dim s As String
s = "Heute ist der "
s &= DateTime.Now.toShortDateString()
s &= "."
lblZeit.Text = s
End Sub
Diese Prozedur soll Teil der selbst definierten Klasse Codebehind_02_baseclass sein, die ihrerseits von Page abgeleitet ist. Also müssen Sie die Page_Load-Prozedur in eine Klassendefinition einbetten und es ergibt sich diese Form:
Public Class Codebehind_02_baseclass : Inherits Page
Public Sub Page_Load (ByVal Sender As Object, _
ByVal E As EventArgs)
Dim s As String
s = "Heute ist der "
s &= DateTime.Now.toShortDateString()
s &= "."
lblZeit.Text = s
End Sub
End Class
Die erste Zeile ließe sich auch so formulieren:
Public Class Codebehind_02_baseclass
Inherits Page
| Tipp Die einzeilige Formulierung mit dem Doppelpunkt ist eine syntaktische Alternative, die VB.NET zur Verfügung stellt, um mehrere Zeilen hintereinander in eine Zeile schreiben zu können.
|
Innerhalb von Page_Load greifen Sie auf das Label-Feld lblZeit zu. Diese Variable müssen Sie innerhalb der Klasse jedoch erst noch verfügbar machen. Also ergänzen Sie eine weitere Zeile Code.
Public Class Codebehind_02_baseclass : Inherits Page
Protected lblZeit as Label
Public Sub Page_Load (ByVal Sender As Object, _
ByVal E As EventArgs)
' ...
lblZeit.Text = s
End Sub
End Class
Statt mit Protected könnten Sie lblZeit auch mit dem Zugriffsmodifizierer Public ausstatten. Da Sie aber die Basisklasse bearbeiten, von der ihre aspx-Seiten abgeleitet werden, scheint die Wahl von Protected angemessen zu sein.
Wenn Sie eine aspx-Seite erstellen, werden viele Namespaces automatisch importiert, ohne dass Sie diese eigens angeben müssten. Für frei definierten VB-Code gilt das nicht. Sie müssen dem Compiler helfen, solche Klassen wie Page, Label und DateTime korrekt zuzuordnen, indem Sie die benötigten Imports-Anweisungen ergänzen.
Imports System
Imports System.Web.UI
Imports System.Web.UI.WebControls
Public Class Codebehind_02_baseclass : Inherits Page
' ...
End Class
Der Namespace System ist von grundlegender Art. Hier ist unter anderem auch die Klasse EventArgs zu finden. In System.Web.UI finden Sie die Page-Klasse und System.Web.UI.WebControls benötigen Sie für die Label-Klasse.
Damit ist der Umbau zur Code-Behind-Klasse abgeschlossen. Beim anschließenden Aufruf von codebehind_02.aspx ergibt sich das gleiche Bild wie beim Aufruf von codebehind_01.aspx.
|