Codemodell für ASP.NET-Webseiten

Aktualisiert: November 2007

Eine ASP.NET-Webseite besteht aus zwei Teilen:

  • Visuelle Elemente, die Markup, Serversteuerelemente und statischen Text einschließen.

  • Programmierlogik für die Seite, die Ereignishandler und anderen Code einschließt.

ASP.NET stellt zwei Modelle zum Verwalten der visuellen Elemente und des Codes bereit: das Einzeldateiseitenmodell und das Code-Behind-Seitenmodell. Die Funktionsweise beider Modelle ist gleich, und Sie können für beide die gleichen Steuerelemente und den gleichen Code verwenden.

In diesem Thema wird erklärt, wie die einzelnen Modelle funktionieren, und es werden Vorschläge angeboten, wann welches Modell zu wählen ist.

Das Einzeldateiseitenmodell

Im Einzeldateiseitenmodell werden das Markup der Seite und der Programmcode in derselben physikalischen ASPX-Datei gespeichert. Der Programmcode befindet sich in einem script-Block, der das Attribut enthält. Dieses Attribut kennzeichnet den Block als Code, der von ASP.NET ausgeführt werden soll.

Das folgende Codebeispiel zeigt eine Einzeldateiseite, die ein Button-Steuerelement und ein Label-Steuerelement enthält. Der markierte Bereich zeigt den Click-Ereignishandler für das Button-Steuerelement in einem script-Block.

<%@ Page Language="VB" %>
<script >
    Protected Sub Button1_Click(ByVal sender As Object, _            ByVal e As System.EventArgs)        Label1.Text = "Clicked at " & DateTime.Now.ToString()    End Sub
</script>

<html>
<head id="Head1" >
  <title>Single-File Page Model</title>
</head>
<body>
  <form id="form1" >
    <div>
      <asp:Label ID="Label1" 
         Text="Label">
      </asp:Label>
      <asp:Button ID="Button1" 
          OnClick="Button1_Click" Text="Button">
      </asp:Button>
    </div>
  </form>
</body>
</html>
<%@ Page Language="C#" %>
<script >
void Button1_Click(Object sender, EventArgs e){    Label1.Text = "Clicked at " + DateTime.Now.ToString();}
</script>
<html>
<head>
  <title>Single-File Page Model</title>
</head>
<body>
  <form >
    <div>
       <asp:Label id="Label1" 
          Text="Label">
       </asp:Label>
       <br />
       <asp:Button id="Button1" 
          
         onclick="Button1_Click" 
         Text="Button">
      </asp:Button>
    </div>
  </form>
</body>
</html>

Der script-Block kann so viel Code enthalten, wie für die Seite erforderlich ist. Der Code kann Ereignishandler für Steuerelemente auf der Seite (wie im Beispiel), Methoden, Eigenschaften sowie sämtlichen anderen Code enthalten, den Sie normalerweise in einer Klassendatei verwenden. Zur Laufzeit wird eine Einzeldateiseite wie eine Klasse behandelt, die von der Page-Klasse abgeleitet ist. Die Seite enthält keine explizite Klassendeklaration. Stattdessen generiert der Compiler eine neue Klasse, die die Steuerelemente als Member enthält. (Nicht alle Steuerelemente werden als Seitenmember verfügbar gemacht, einige sind untergeordnete Elemente anderer Steuerelemente.) Der Code in der Seite wird zum Bestandteil der Klasse. Beispielsweise werden die von Ihnen erstellten Ereignishandler zu Membern der abgeleiteten Page-Klasse.

Weitere Informationen finden Sie unter Übersicht über die ASP.NET-Seitenklasse.

Das Code-Behind-Seitenmodell

Im Code-Behind-Seitenmodell können Sie das Markup in einer Datei, der ASPX-Datei, und den Programmcode in einer anderen Datei ablegen. Der Name der Codedatei variiert je nach Programmiersprache, die Sie verwenden.

Hinweis:

Code-Behind-Dateien für ASP.NET-Webseiten können nicht in allen .NET-Programmiersprachen erstellt werden. Die Sprachen müssen partielle Klassen unterstützen. Zum Beispiel unterstützt J# keine partiellen Klassen. Deshalb ist es nicht möglich, in J# Code-Behind-Dateien für ASP.NET-Seiten zu erstellen.

Wenn Sie beispielsweise mit einer Seite mit dem Namen SamplePage arbeiten, befindet sich das Markup in der Datei SamplePage.aspx und der Code in der Datei SamplePage.aspx.vb (für Visual Basic), SamplePage.aspx.cs (für C#) usw.

Hinweis:

Das in .NET Framework, Version 2.0, verwendete Code-Behind-Modell unterscheidet sich von dem in früheren Versionen verwendeten Modell.

Das Beispiel der Einzeldateiseite aus dem vorhergehenden Abschnitt würde im Code-Behind-Modell aus zwei Teilen bestehen. Das Markup würde sich in einer Datei befinden (in diesem Beispiel SamplePage.aspx), und es würde der Einzeldateiseite im folgenden Beispiel ähneln.

<%@ Page Language="VB" CodeFile="SamplePage.aspx.vb" 
    Inherits="SamplePage" AutoEventWire="false" %>
<html>
<head  >
   <title>Code-Behind Page Model</title>
</head>
<body>
  <form id="form1" >
    <div>
       <asp:Label id="Label1" 
          Text="Label" >
      </asp:Label>
      <br />
      <asp:Button id="Button1" 
          
         onclick="Button1_Click" 
         Text="Button" >
       </asp:Button>
    </div>
  </form>
</body>
</html>
<%@ Page Language="C#" CodeFile="SamplePage.aspx.cs" 
    Inherits="SamplePage" AutoEventWireup="true" %>
<html>
<head  >
   <title>Code-Behind Page Model</title>
</head>
<body>
  <form id="form1" >
    <div>
       <asp:Label id="Label1" 
          Text="Label" >
      </asp:Label>
      <br />
      <asp:Button id="Button1" 
          
         onclick="Button1_Click" 
         Text="Button" >
       </asp:Button>
    </div>
  </form>
</body>
</html>

Es gibt zwei Unterschiede zwischen der ASPX-Seite im Einzeldateimodell und im Code-Behind-Modell. Im Code-Behind-Modell enthält die Seite keinen script-Block mit dem -Attribut. (Die Seite kann jedoch script-Blöcke ohne das -Attribut enthalten, wenn Sie clientseitiges Skript in die Seite schreiben möchten.) Der zweite Unterschied besteht darin, dass die @ Page-Direktive im Code-Behind-Modell Attribute enthält, die auf eine externe Datei (SamplePage.aspx.vb oder SamplePage.aspx.cs) und auf eine Klasse verweisen. Diese Attribute verknüpfen die ASPX-Seite mit dem Code.

Der Code befindet sich in einer separaten Datei. Das folgende Codebeispiel zeigt eine Code-Behind-Datei, die den gleichen Click-Ereignishandler wie das Beispiel für die Einzeldateiseite enthält.

Partial Class SamplePage
    Inherits System.Web.UI.Page
    Protected Sub Button1_Click(ByVal sender As Object, _
            ByVal e As System.EventArgs) Handles Button1.Click
        Label1.Text = "Clicked at " & DateTime.Now.ToString()
    End Sub
End Class
using System;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
public partial class SamplePage : System.Web.UI.Page
{
    protected void Button1_Click(object sender, EventArgs e)
    {
        Label1.Text = "Clicked at " + DateTime.Now.ToString();
    }
}

Die Code-Behind-Datei enthält die vollständigen Klassendeklarationen im Standardnamespace. Die Klasse wird jedoch mit dem partial-Schlüsselwort deklariert. Dieses Schlüsselwort zeigt an, dass sich nicht die gesamte Klasse in einer Datei befindet. Stattdessen liest der Compiler beim Ausführen der Seite die ASPX-Seite und die Datei, auf die in der @ Page-Direktive verwiesen wird, assembliert beide in eine einzige Klasse und kompiliert sie als Einheit in eine einzige Klasse.

Die partielle Klassendatei erbt von der Page-Seitenklasse. Weitere Informationen finden Sie unter Übersicht über die ASP.NET-Seitenklasse.

Auswählen eines Seitenmodells

Das Einzeldatei- und das Code-Behind-Seitenmodell sind in ihrer Funktion gleich. Beide Modelle werden zur Laufzeit auf dieselbe Weise ausgeführt, und es besteht zwischen ihnen kein Unterschied hinsichtlich der Leistung. Die Auswahl des Seitenmodells richtet sich daher nach anderen Faktoren, wie zum Beispiel der Frage, wie Sie den Code in der Anwendung organisieren möchten, und ob es wichtig ist, den Seitenentwurf von der Codierung zu trennen.

Hinweis:

Die in der Dokumentation enthaltenen Beispiele werden häufig als Einzeldateiseiten dargestellt. Dies geschieht hauptsächlich zur Vereinfachung für den Leser. Auf diese Weise kann vermieden werden, dass für jedes Beispiel jeweils zwei Dateien veranschaulicht werden müssen. Die Tatsache, dass die Dokumentation hauptsächlich Einzeldateiseiten enthält, bedeutet nicht, dass Einzeldateiseiten gegenüber Code-Behind-Seiten bevorzugt werden oder über inhärente Vorteile irgendeiner Art verfügen.

Vorteile von Einzeldateiseiten

Das Einzeldateimodell ist grundsätzlich für Seiten geeignet, deren Code hauptsächlich aus Ereignishandlern für die Steuerelemente auf der Seite besteht.

Das Einzeldateiseitenmodell bietet unter anderem folgende Vorteile:

  • Bei Seiten, die nur wenig Code enthalten, kann die Möglichkeit, Code und Markup in derselben Datei abzulegen, die Vorteile des Code-Behind-Modells aufwiegen. So kann es beispielsweise einfacher sein, eine Einzeldateiseite zu analysieren, weil sich Code und Markup am selben Ort befinden.

  • Seiten, die auf dem Einzeldateimodell basieren, können leichter bereitgestellt oder an andere Programmierer gesendet werden, da sie nur aus einer Datei bestehen.

  • Da zwischen den Dateien keine Abhängigkeiten bestehen, kann eine Einzeldateiseite leichter umbenannt werden.

  • Die Verwaltung von Dateien in einem Quellcodeverwaltungssystem wird vereinfacht, da die in sich geschlossene Seite in einer einzelnen Datei enthalten ist.

Vorteile von Code-Behind-Seiten

Die Vorteile von Code-Behind-Seiten kommen vor allem bei Webanwendungen mit großem Codeumfang oder bei solchen Webanwendungen zum Tragen, bei denen mehrere Entwickler eine Website erstellen.

Das Code-Behind-Modell bietet unter anderem folgende Vorteile:

  • Code-Behind-Seiten ermöglichen eine saubere Trennung von Markup (Benutzeroberfläche) und Code. Es ist vorteilhaft, wenn ein Designer am Markup arbeitet, während ein Programmierer Code schreibt.

  • Der Code ist für Seitendesigner und andere Beteiligte, die nur mit dem Seitenmarkup arbeiten, nicht verfügbar.

  • Code kann für mehrere Seiten wiederverwendet werden.

Kompilierung und Bereitstellung

Die Kompilierung und die Bereitstellung von Einzeldatei- und Code-Behind-Seiten sind sehr ähnlich. Im einfachsten Fall müssen Sie lediglich die Seite auf den Zielserver kopieren. Wenn Sie mit Code-Behind-Seiten arbeiten, müssen Sie sowohl die ASPX-Seite als auch die Codedatei kopieren. Wenn die Seite zum ersten Mal angefordert wird, kompiliert ASP.NET die Seite und führt sie aus. Beachten Sie, dass Sie in beiden Fällen zusammen mit dem Markup auch Quellcode bereitstellen.

Alternativ können Sie die Website vorkompilieren. In diesem Fall generiert ASP.NET Objektcode für die Seiten, den Sie anschließend auf den Zielserver kopieren können. Die Vorkompilierung funktioniert sowohl für das Einzeldatei- als auch für das Code-Behind-Modell, und die Ausgabe ist bei beiden Modellen gleich. Weitere Informationen hierzu finden Sie unter Übersicht über die ASP.NET-Vorkompilierung.

Siehe auch

Konzepte

Übersicht über den Lebenszyklus von ASP.NET-Seiten

Übersicht über die ASP.NET-Kompilierung