Homepage-Webhilfe Event-Banner

Grundlagen

ASP.NET WebForms gilt als zentraler Bestandteil von ASP.NET und ist zudem vergleichbar mit dem „klassischen ASP“. WebForms bietet eine einfache Möglichkeit, den HTML-Code und die Logik der Webanwendung miteinander zu verbinden. Dies ist auf Grund des MVC-Konzepts nicht immer erwünscht, erleichtert jedoch oft die Erstellung einer Webseite. ASP.NET WebForms kann also teilweise mit PHP verglichen werden: Es gibt einen HTML-Code, in welchem Codeblöcke eingebettet werden. In diesen Codeblöcken können dann programmgesteuert (also z. B. verknüpft mit Abfragen oder Schleifen) HTML-Ausgaben oder anderes ausgeführt werden.


Visual-Studio-Screenshot Zur Entwicklung einer WebForms-Applikation wird üblicherweise die Microsoft-eigene Entwicklungsumgebung Visual Studio eingesetzt. Natürlich gibt es auch einige Alternativen zu dieser IDE. Jedoch ist zu erwähnen, dass die Verwendung von Visual Studio gerade für Anfänge oft einfacher ist. Hier ist es von Vorteil, dass seit Version 2015 die vollausgestattete IDE für Privatanwender kostenlos zur Verfügung gestellt wird.

Um ein WebForms-Projekt in Visual Studio zu erstellen, wählen Sie „ASP.NET-Web Forms-Anwendung“ unter dem Menüpunkt „Web“ aus. Dabei wird ein Beispiel-Projekt erzeugt, welches bereits einige Seiten und Programmcode enthält. Für ein übersichtliches Programm bzw. für ein eigenes Projekt ist es jedoch u. U. ratsamer, den Eintrag „Leere ASP.NET-Webanwendung“ auszuwählen. Dadurch erhalten Sie ein leeres Projekt, welchem Sie nun im Nachhinein einzelne WebForms-Seiten hinzufügen können. Hierzu klicken Sie, nachdem Sie das Projekt erstellt haben, auf Ihr Projekt und wählen „Hinzufügen“ » „Neues Element“. Im darauf erscheinenden Dialog können Sie „Web Form“ auswählen und einen Dateinamen eingeben. Anders als bei Apache-Servern wird für die Standardseite eines Verzeichnisses nicht der Name index (z. B. index.html oder index.php) verwendet, sondern Default (in Bezug auf ASP.NET: Default.aspx). Dies kann jedoch über die Webserverkonfiguration (Datei Web.config) geändert werden.

Beim Erstellen eines „Web Form“-Elements werden automatisch mehrere Dateien (z. B. bei Verwendung des Basisnamens Default) angelegt: Default.aspx, Default.aspx.cs und Default.aspx.designer.cs. Die Datei mit der Endung .aspx enthält die „Web Form“ (zu Deutsch das Webformular). Grundsätzlich kann der Inhalt der .aspx-Datei mit einer HTML-Datei verglichen werden. Neben HTML-Code können hier jedoch auch ASP.NET-Codeblöcke eingebunden werden (dazu später mehr). Des Weiteren gibt es spezielle HTML-Elemente, welche bevor diese an den Browser geschickt werden, ersetzt werden. Dadurch ist es dann leicht möglich, Benutzersteuerelemente (engl. User Controls) und andere Webserver-Steuerelemente (z. B. einen Kalender) einzubinden. Die .aspx.cs-Datei wird als Code-Behind-Datei bezeichnet und enthält den eigentlichen Programmcode (C# oder .aspx.vb für Visual Basic). Der Ansatz mit der Code-Behind-Datei wird von Microsoft auch als Code-Behind-Modell bezeichnet und dient zur Trennung zwischen „View“ und „Controller“. So ist das MVC-Konzept zwar bereits in ASP.NET WebForms enthalten, jedoch in ASP.NET MVC noch stärker ausgeprägt. Eine Datei mit der Endung .aspx.designer.cs wird von Visual Studio automatisch erstellt und erweitert die Klasse, welche in der Datei .aspx.cs definiert ist. Bei dem Inhalt der Datei .aspx.designer.cs handelt es sich um Variablendeklarationen von Webserver-Steuerelementen und anderen serverseitigen Steuerelementen, welche ein id-Attribut besitzen.

Visual Studio enthält neben Codevervollständigung (IntelliSense), Syntax-Highlighting und der Projektverwaltung einen Debugger, einen Designer (dies gilt nicht nur für Windows Forms, sondern eben auch für ASP.NET), einen Compiler und den IIS Express. Beim Debuggen einer Webanwendung wird nach der Kompilierung der IIS Express gestartet und die Anwendung im Standardbrowser geöffnet. Das Debuggen ist also grundsätzlich so wie bei anderen Anwendungen auch.

Möchten Sie Ihre Projekte auf einem anderen Webserver ausführen und / oder veröffentlichen, so müssen Sie auf diesen lediglich die .aspx-Dateien sowie den Ordner bin kopieren. Der Ordner bin muss dabei standardmäßig im Root-Verzeichnis liegen. Für jedes Projekt gibt es eine eigene DLL. Die DLL enthält den kompilierten Code der C#-Dateien und somit auch den der Dateien .aspx.cs und .aspx.designer.cs. Des Weiteren benötigen Sie die Konfigurationsdatei Web.config.

Wichtig: Die aufgezählten Schritte und Bezeichnungen für die Erstellung eines Web-Projekts beziehen sich auf Visual Studio 2013 und das .NET Framework 4.0. Bei anderen Visual Studio Versionen oder anderen .NET Framework Versionen können sich diese Schritte und Bezeichnungen unterscheiden.


Nach dieser theoriebelasteten Einführung wollen wir nun unsere erste Webseite erstellen. Hierzu erstellen wir ein leeres Projekt und legen ein Webformular mit dem Namen Default.aspx (wie oben beschrieben) an. Anschließend können Sie den automatisch erstellten HTML-Code an Ihre Vorstellungen anpassen oder diesen auch vorerst beibehalten. Nun fügen Sie im body-Element folgenden Code ein <%= DateTime.Now.ToString() %>. Durch diesen Code wird die aktuelle Zeit des Servers in die Ausgabedatei geschrieben, welche nach Bearbeitung der kompletten .aspx-Datei an den Webbrowser gesendet wird.

Das folgende Beispiel enthält lediglich die Ausgabe der Serverzeit. Über das Lupenicon können Sie sich das Beispiel ansehen. Mit dem ersten Icon können Sie sich die Projektmappe des Projekts downloaden. Für die Erstellung dieses und aller anderen Beispiele wurde Visual Studio 2013 Professional benutzt. Die Beispiele wurden mit dem .NET Framework 4.0 erstellt, worauf auch diese Tutorial basiert. Auf den Codeblock (beginnend mit <%= und endend mit %>) gehen wir weiter unten noch genauer ein. Der erste Code-Ausschnitt zeigt den ASPX-Code (welcher von uns geändert wurde). Im zweiten Code-Ausschnitt ist der C#-Code (von der Code-Behind-Datei) zu sehen, welche von uns noch nicht geändert wurde.

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="HWhBsp.Erste_Webseite.Default" %>

<!DOCTYPE html>
<html>
    <head>
        <title>Erste Webseite - ASP.NET Code-Beispiel</title>

        <meta charset="utf-8" />

        <meta name="robots" content="noindex,nofollow" />
        <meta name="publisher" content="Homepage-Webhilfe" />
    </head>
    
    <body>
        Serverzeit: <%= DateTime.Now.ToString() %>
    </body>
</html>
using System;

namespace HWhBsp.Erste_Webseite
{
    public partial class Default : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {

        }
    }
}
VorschauDownload

Grundsätzlich ist zwischen ASPX- und C#-Code zu differenzieren. Der „reine“ C#-Code befindet sich in der Code-Behind-Datei und somit in den Dateien .aspx.cs und .aspx.designer.cs. Dort kann, so wie in jeder anderen .cs-Datei auch, ganz normaler C#-Code notiert werden. Natürlich können Sie Ihrem Projekt auch weitere .cs-Dateien hinzufügen. In dem C#-Code einer ASP.NET-Anwendung stehen Ihnen selbstverständlich alle Klassen des .NET-Frameworks zur Verfügung. Für die Webanwendung selbst werden jedoch Klassen aus dem Namensraum System.Web und deren Sub-Namensräume verwendet. Die Basisklasse einer Seite ist Page aus dem Namensraum System.Web.UI. Der ASPX-Code besteht grundsätzlich mal aus HTML-Code (ggf. mit eingebettetem CSS- oder JavaScript-Code) und einer sogenannten Direktive (dazu gleich mehr).

Innerhalb des ASPX-Codes gibt es unterschiedliche Möglichkeiten, C#-Code einzubetten, um somit z. B. HTML-Code dynamisch auszugeben. C#-Code kann z. B. über das HTML-Element script mit dem Attribut runat und dem Wert server eingebettet werden. Diese Methode wird vor allem bei vielen Beispielcodes (überwiegend der von Microsoft) verwendet, um Event-Handler zu notieren. Wir empfehlen Ihnen jedoch auf Grund des MVC-Konzepts, diese in die Code-Behind-Datei auszulagern.

<script runat="server">
for (int i = 0; i < 10; i++)
{
    Response.Write(i + "<br />");
}
</script>

Geläufiger sind jedoch die Tags für sogenannten Inline-Code. In diesen kann, so wie im script-Element auch, eine Schleife, Abfrage oder anderes platziert werden, jedoch sind Variablen die innerhalb dieses Blocks notiert wurden, nur innerhalb dieses Blocks verfügbar. Inline-Codes werden innerhalb der Server-Tags <% und %> platziert.

<%
for (int i = 0; i < 10; i++)
{
    Response.Write(i + "<br />");
}
%>

Von dem öffnenden Tag <% gibt es noch einige andere Varianten. Dazu zählen <%@, <%=, <%:, <%# und <%$. Bei <%@ handelt es sich um sogenannte Direktiven, auf welche wir nachher noch genauer eingehen. <%= und <%: wird dazu verwendet eine Ausgabe in der resultierenden HTML-Datei durchzuführen. Dabei entspricht der Code <%= "Hallo!" %> dem Code <% Response.Write("Hallo!") %>. Der Tag <%= ist natürlich hier zu bevorzugen, da dadurch ein kürzerer Code entsteht. Der Unterschied zwischen <%= und <%: ist, dass bei <%: der Inhalt vorher HTML enkodiert wird. Dadurch können Sonderzeichen von HTML (vor allem <, > und &, aber auch " und ') „sicher“ dargestellt werden. Je nach Seitenkodierung werden auch andere Zeichen in Sonderzeichen (Unicode-Format) umgewandelt. Eine solche Kodierungsfunktion findet sich in der Klasse HttpUtility (Funktion HtmlEncode). Bei Verwendung des Tags <%: wird diese Funktion automatisch aufgerufen, bei <%= hingegen nicht.

<%= "Hallo Welt!" %>
<%: "< Herzlich Willkommen >" %>

Der Tag <%$ wird für sogenannte Ausdrücke benutzt. Dadurch ist es möglich, Werte aus Konfigurationsdateien (AppSettings) oder Ressourcendateien (Ressources) zu holen. Als allgemeiner Syntax gilt hier Ausdruckstyp:Ausdruckswert:

<%$ AppSettings:EMailAdresse %>

Mit Hilfe des Tags <%# ist es möglich, Datenbindungen vorzunehmen. Diese werden wir jedoch an dieser Stelle nicht weiter behandeln.

<%# kontaktListe %>

Nun wollen wir uns auch noch mit den sogenannten Direktiven beschäftigen. Direktiven stehen (zumeist) in den obersten Zeilen von ASPX-Dateien oder vergleichbaren Dateien (z. B. ASAX-, ASCX- oder Master-Dateien) und sind dazu gedacht, Einstellungen für die Kompilierung festzulegen. Für die ersten Seiten (und auch auf der Seite im oberen Beispiel) wird lediglich die Page-Direktive benutzt.

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="MeineTestseite.Default" %>

Es gibt noch einige weitere Direktiven, wie z. B. <%@ Control für Benutzersteuerelemte und <%@ Master für Masterseiten. Neben den bereits genannten Direktiven gibt es noch ein paar weitere, die jedoch nicht sehr häufig verwendet werden.

Neben den bisher genannten Tags gibt es noch ein Tag-Paar für serverseitige Kommentare (außerhalb eines Codeblocks). Dabei handelt es sich um die Tags <%-- und --%>. Diese Art der Kommentierung kann dazu genutzt werden, wenn ein bestimmter Teil (z. B. der ASPX-Datei) nicht an den Browser gesendet und nicht vom Interpreter bearbeitet werden soll.

<%-- Dieser Text wird nicht an den Browser gesendet! --%>

Wie bereits oben genannt, werden die einzelnen WebForms von der Klasse Page (Namensraum System.Web.UI) abgeleitet. Zwei wichtige Eigenschaften dieser Klasse sind Request und Response, welche auf ein Objekt der Klasse HttpRequest und HttpResponse verweisen. Mit Hilfe dieser Klasse ist es möglich, Daten der Anfrage (engl. request) abzufragen und die Antwort (engl. response) zu beeinflussen. Wie bereits oben angesprochen, kann mittels der Funktion Response.Write() Inhalt auf die HTML-Seite geschrieben werden. Auf weitere Eigenschaften und Funktionen dieser Klassen gehen wir später noch genauer ein.

ASP.NET stellt uns einige sogenannte Webserver-Steuerelemente zur Verfügung. Neben diesen ist es jedoch auch möglich, auf einfache HTML-Steuerelemente (z. B. ein input-Element) zuzugreifen. Dabei sind alle HTML-Elemente von der Basisklasse HtmlControl (Namensraum System.Web.UI.HtmlControls) abgeleitet. Für einige Elemente (z. B. das input-Element) gibt es eine von HtmlControl abgeleitete Klasse (z. B. HtmlInputControl für das input-Element). In beiden Fällen, also bei normalen HTML-Elementen und bei Webserver-Steuerelementen, muss in dem Element zwingend eine ID (Attribut id) und das Attribut runat mit dem Wert server gesetzt werden. Der mit dem Attribut id vergebene Name wird auch im id-Attribut des HTML-Codes gesetzt. Webserver-Steuerelemente besitzen als Tag-Namen immer das Präfix asp gefolgt von einem Doppelpunkt. Mehr dazu jedoch im Thema Webserver-Steuerelemente. Zudem muss noch beachtet werden, dass alle Elemente auf die per ASP.NET zugegriffen werden soll innerhalb eines form-Elements platziert werden müssen. Das form-Element muss dann ebenfalls das Attribut runat mit dem Wert server besitzen.

Neben dem Zugriff auf Attribute und Werte von HTML-Elementen und Webserver-Steuerelementen können bei diesen auch Ereignisse registriert werden. Da das HTTP-Protokoll zustandslos ist und somit über mehrere Verbindungen sich Daten nicht merkt, müssen alle Informationen einer Sitzung bzw. einer Seite serverseitig gespeichert oder clientseitig im HTML-Dokument hinterlegt und beim Absenden eines Formulars mitübertragen werden. Hier ist uns ASP.NET, im Gegensatz zu PHP, eine sehr große Hilfe. Ereignisse von Steuerelementen werden über sogenannte Postbacks (engl. zurückschicken) ausgelöst. Ereignisse solcher Art werden i. d. R. nicht direkt ausgelöst, sondern innerhalb des sogenannten Ansichtszustands gespeichert und beim nächsten Übertragen des Formulars vom Webserver ausgelöst. Sollen die Ereignisse direkt ausgelöst werden, was jedoch auch ein erneutes Laden der Seite zur Folge hat, so können Sie die Eigenschaft AutoPostBack des jeweiligen Elements setzen. Postbacks kommen jedoch auch beim Übertragen von Formularen zum Einsatz, wenn die Formulardaten an den Server übertragen bzw. „gepostet“ werden. Hier ist auch selber ausprobieren angesagt, denn wodurch lernt man besser, wie sich bestimmte Einstellungen auswirken, wie wenn man es selber sieht. Um zu prüfen, ob es sich bei der aktuellen Anfrage um einen Postback handelt, kann die Eigenschaft IsPostBack geprüft werden.

Neben den Ereignissen von Elementen gibt es noch ein paar Seitenevents, welche während des Lebenszyklus einer Seite aufgerufen werden. Die Events müssen standardmäßig nicht registriert werden, da diese durch die Eigenschaft AutoEventWireUp in der Page-Direktive, direkt an die Funktionen Page_Eventname gebunden werden (sofern diese vorhanden sind). Folgende Ereignisse stehen zu Verfügung und werden in der aufgelisteten Reihenfolge aufgerufen:

PreInit Event, bevor die Initialisierung der Seite und deren Elemente ausgeführt wird
Init Event, bevor die Initialisierung der Seite und deren Elemente ausgeführt wird, jedoch nachdem alle PreInit-Events augelöst wurden
InitComplete Event, nachdem die Initialisierung der Seite und deren Elemente ausgeführt wurde
PreLoad Event, bevor die Seite und deren Elemente geladen wird
Load Event, bevor die Seite und deren Elemente geladen wird, jedoch nachdem alle PreLoad-Events ausgelöst wurden
LoadComplete Event, nachdem die Seite und deren Elemente geladen wurde
PreRender Event, bevor die Seite und Elemente „dargestellt“ wird
Render Event, bevor die Seite und Elemente „dargestellt“ wird, jedoch nachdem alle PreRender-Events ausgelöst wurden
Unload Event, nachdem die Seite und Elemente „dargestellt“ und somit komplett bearbeitet wurde

Bei den Ereignissen ist es auch sinnvoll, ein wenig selbst damit zu experimentieren. Wie Sie der Tabelle entnehmen können, werden Events wie PreLoad und Load sozusagen direkt nacheinander ausgeführt, jedoch werden zwischen dem Aufruf von PreLoad und Load der Seite die PreLoad-Ereignisse der einzelnen Steuerelemente ausgeführt. Die Funktion des Load-Ereignisses wird von Visual Studio standardmäßig in der Code-Behind-Datei angelegt. Das Load-Ereignis dient klassischerweise zum Herstellen von Verbindungen (z. B. einer Datenbankverbindung) oder zum Laden von Ressourcen. Das Unload-Event wird hingegen dazu verwendet, um Verbindungen wieder abzubauen. In diesem Moment ist die Datei, welche an den Browser geschickt wird, abgeschlossen und kann nicht mehr verändert werden.

Um unsere Webseite für Sie optimal zu gestalten und fortlaufend verbessern zu können, verwenden wir Cookies. Durch die weitere Nutzung der Webseite stimmen Sie der Verwendung von Cookies zu. Weitere Informationen OK