Übersicht über den ASP.NET-Ansichtszustand

Aktualisiert: November 2007

Der Ansichtszustand ist die Methode, die vom ASP.NET-Seitenframework verwendet wird, um die Werte der Seiten und Steuerelemente zwischen den Roundtrips beizubehalten. Beim Rendern des HTML-Markups für die Seite werden der aktuelle Zustand der Seite und die Werte, die während des Postbacks beibehalten werden müssen, in Base64-codierten Zeichenfolgen serialisiert. Diese Informationen werden anschließend in dem ausgeblendeten Feld bzw. in den Feldern für den Ansichtszustand abgelegt.

Dieses Thema enthält folgende Abschnitte:

  • Szenarien

  • ViewState-Features

  • Hintergrund

  • Klassenreferenz

  • Zusätzliche Ressourcen

  • Neues

Szenarien

Der Ansichtszustand wird automatisch vom ASP.NET-Seitenframework zum Beibehalten von Informationen verwendet, die zwischen den Postbacks erhalten bleiben müssen. Zu diesen Informationen gehören alle nicht standardmäßigen Werte von Steuerelementen.

Sie können den Ansichtszustand auch verwenden, um seitenspezifische Anwendungsdaten zu speichern.

Zurück nach oben

Features

Der Ansichtszustand ist ein Repository in einer ASP.NET-Seite, die die während des Postbacks beizubehaltenden Werte speichern kann. Der Ansichtszustand wird vom Seitenframework verwendet, um Steuerelementeinstellungen zwischen Postbacks beizubehalten.

Sie können den Ansichtszustand in Ihren eigenen Anwendungen verwenden, um Folgendes auszuführen:

  • Beibehalten von Werten zwischen Postbacks, ohne diese im Sitzungszustand oder in einem Benutzerprofil zu speichern.

  • Speichern der von Ihnen festgelegten Werte für Seiten- oder Steuerelementeigenschaften.

  • Erstellen eines benutzerdefinierten Anbieters für den Ansichtszustand zum Speichern von Ansichtszustandsinformationen in einer SQL Server-Datenbank oder einem anderen Datenspeicher.

Sie können im Ansichtszustand beispielsweise Informationen speichern, auf die beim nächsten Senden der Seite an den Server während des Ladeereignisses im Code zugegriffen werden kann. Empfehlungen zur Verwendung finden Sie unter Empfehlungen zur ASP.NET-Zustandsverwaltung.

Zurück nach oben

Hintergrund

Eine Webanwendung ist zustandsfrei. Bei jeder Anforderung der Seite vom Server wird eine neue Instanz der Webseitenklasse erstellt. Normalerweise würden daher bei jedem Roundtrip alle Informationen der Seite und ihrer Steuerelemente verloren gehen. Wenn ein Benutzer auf einer HTML-Webseite beispielsweise Informationen in einem Textfeld eingibt, werden diese Informationen standardmäßig an den Server gesendet. Sie werden jedoch in der Antwort an den Browser nicht zurückgegeben.

Um diese systeminterne Einschränkung der Webprogrammierung zu umgehen, enthält das ASP.NET-Seitenframework mehrere Zustandsverwaltungsfeatures zum Beibehalten der Seiten- und Steuerelementwerte zwischen den Roundtrips zum Webserver. Eines dieser Features ist der AnsichtszustandÜbersicht über die ASP.NET-Zustandsverwaltung.

Der Ansichtszustand wird vom ASP.NET-Seitenframework standardmäßig verwendet, um die Seiten- und Steuerelementwerte zwischen den Roundtrips beizubehalten. Beim Rendern von HTML für die Seite werden der aktuelle Zustand der Seite und die Werte, die während des Postbacks beibehalten werden müssen, in Base64-codierten Zeichenfolgen serialisiert. Anschließend werden sie in ein oder mehrere ausgeblendete Felder in die Seite eingefügt.

Sie können im Code mit der Eigenschaft ViewState der Seite auf den Ansichtszustand zugreifen. Bei der Eigenschaft ViewState handelt es sich um ein Wörterbuch, das Schlüssel-Wert-Paare mit den Ansichtszustandsdaten enthält.

Sicherheitshinweis:

Für böswillige Benutzer ist es einfach, die Inhalte eines ausgeblendeten Felds anzuzeigen und zu ändern. Weitere Informationen zum Sichern von Ansichtszustandsdaten finden Sie weiter unten in diesem Thema unter Sichern des Ansichtszustands.

Empfehlungen dazu, wann Sie Informationen im Ansichtszustand speichern sollten, finden Sie unter Empfehlungen zur ASP.NET-Zustandsverwaltung.

Sie können das Standardverhalten ändern und den Ansichtszustand an einem anderen Speicherort speichern (z. B. in einer SQL Server-Datenbank), indem Sie eine benutzerdefinierte PageStatePersister-Klasse zum Speichern der Seitendaten implementieren. Ein Beispiel für das Speichern des Seitenzustands in einem Stream statt in einem ausgeblendeten Feld finden Sie im Beispiel für die PageStatePersister-Klasse.

Überlegungen zur Verwendung des Ansichtszustands

Der Ansichtszustand enthält Zustandsinformationen für eine bestimmte ASP.NET-Seite. Wenn Sie Informationen auf mehr als einer Seite verwenden müssen oder wenn Informationen bei mehreren Besuchen einer Website beibehalten werden sollen, empfiehlt es sich, zum Verwalten des Zustands eine andere Methode zu verwenden. Sie können den Anwendungszustand, den Sitzungszustand oder die Profileigenschaften verwenden.

Ansichtszustandsinformationen werden in XML serialisiert und anschließend mit Base64-Codierung verschlüsselt. Dies führt u. U. zum Entstehen großer Datenmengen. Der Inhalt des Ansichtszustands wird beim Senden der Seite zum Server als Teil der Postbackinformationen gesendet. Wenn der Ansichtszustand große Informationsmengen enthält, kann dies die Leistung der Seite beeinflussen. Testen Sie die Leistung Ihrer Seiten mit typischen Daten, um für Ihre Anwendung festzulegen, ob die Größe des Ansichtszustands Leistungsprobleme verursacht. Alternativen zum Verwenden des Ansichtszustands finden Sie unter Empfehlungen zur ASP.NET-Zustandsverwaltung.

Wenn keine Steuerelementinformationen für einzelne Steuerelemente gespeichert werden müssen, können Sie den Ansichtszustand für ein Steuerelement deaktivieren. Wenn ein Steuerelement auf einer Seite bei jedem Postback vom Datenspeicher aktualisiert wird, können Sie den Ansichtszustand für dieses Steuerelement ausschalten, um die Größe des Ansichtszustands zu verringern. Sie können beispielsweise den Ansichtszustand für das Steuerelement GridView ausschalten.

Hinweis:

Selbst bei explizit deaktiviertem Ansichtszustand wird ein ausgeblendetes Feld an den Browser gesendet, um anzugeben, dass für die Seite ein Postback erfolgt.

Beachten Sie außerdem, dass von einigen Proxys und Firewalls der Zugriff auf eine Seite verhindert wird, wenn die Datenmenge in einem ausgeblendeten Feld sehr groß ist. Da die zulässige Höchstmenge mit unterschiedlichen Firewall- und Proxyimplementierungen variiert, werden durch große ausgeblendete Felder möglicherweise Probleme verursacht. Wenn die in der Eigenschaft ViewState gespeicherte Datenmenge den Wert übersteigt, der in der Eigenschaft MaxPageStateFieldLength der Seite festgelegt ist, wird der Ansichtszustand von der Seite in mehrere ausgeblendete Felder aufgeteilt. Dies verhindert, dass die Größe einzelner ausgeblendeter Felder die von Firewalls akzeptierte Größe überschreitet.

Einige mobile Geräte lassen keine ausgeblendeten Felder zu. Deshalb funktioniert der Ansichtszustand bei diesen Geräten nicht. Weitere Informationen und Alternativen finden Sie unter Übersicht über die ASP.NET-Webentwicklung für mobile Geräte.

Steuerelementzustand

Von ASP.NET wird zusätzlich zum Ansichtszustand der Steuerelementzustand unterstützt. Selbst wenn der Ansichtszustand für eine Seite oder für ein Steuerelement deaktiviert ist, behält die Seite mithilfe des Steuerelementzustands die Steuerelementinformationen bei, die zwischen den Postbacks erhalten bleiben müssen. Wie der Ansichtszustand wird der Steuerelementzustand in einem oder mehreren ausgeblendeten Feldern gespeichert.

Speichern von Werten im Ansichtszustand

Sie können auf die Ansichtszustandsinformationen über die ViewState-Eigenschaft der Seite zugreifen, von der ein Wörterbuchobjekt verfügbar gemacht wird. Sie können dieses Wörterbuch verwenden, um benutzerdefinierte Werte zu speichern. Sie können beispielsweise den Wert von benutzerdefinierten Eigenschaften speichern, die Sie auf der Seite festlegen.

Da der Ansichtszustand als ausgeblendetes Feld gesendet wird, können Änderungen des Ansichtszustands auf der Seite bis zum Eintreten des PreRenderComplete-Ereignisses vorgenommen werden. Nach dem Rendern der Seite für den Browser werden Änderungen des Ansichtszustands nicht gespeichert.

Die Informationen im ausgeblendeten Ansichtszustandsfeld können vom Benutzer angezeigt werden, wenn der Quellcode der Webseite angezeigt und die Base-64-codierten Zeichenfolgen dekodiert werden können. Dies stellt ein mögliches Sicherheitsproblem dar. Weitere Informationen zu Sicherheitsproblemen im Zusammenhang mit dem Ansichtszustand finden Sie weiter unten in diesem Thema unter Sichern des Ansichtszustands.

Hinweis:

Um die Eigenschaft ViewState verwenden zu können, muss die ASP.NET-Webseite über ein form-Element mit dem Attribut verfügen.

Um einen Wert im Ansichtszustand zu speichern, erstellen Sie ein neues Element mit dem zu speichernden Wert und fügen das Element dem Ansichtszustandswörterbuch hinzu. Im folgenden Beispiel ist eine ASP.NET-Webseite mit Code dargestellt, in dem eine Zeichenfolge und ein Ganzzahlwert im Ansichtszustand gespeichert wird.

<%@ Page Language="VB" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<script >
  ' Sample ArrayList for the page.
  Dim PageArrayList As ArrayList

  Function CreateArray() As ArrayList
    ' Create a sample ArrayList.
    Dim result As ArrayList
    result = New ArrayList(4)
    result.Add("item 1")
    result.Add("item 2")
    result.Add("item 3")
    result.Add("item 4")
    Return result
  End Function

  Sub Page_Load(ByVal sender As Object, ByVal e As EventArgs)
    If (Me.ViewState("arrayListInViewState") IsNot Nothing) Then
      PageArrayList = CType(Me.ViewState("arrayListInViewState"), ArrayList)
    Else
      ' ArrayList isn't in view state, so it must be created and populated.
      PageArrayList = CreateArray()
    End If
    ' Code that uses PageArrayList.
  End Sub

  Sub Page_PreRender(ByVal sender As Object, ByVal e As EventArgs)
    ' Save PageArrayList before the page is rendered.
    Me.ViewState.Add("arrayListInViewState", PageArrayList)
  End Sub
</script>

<html xmlns="http://www.w3.org/1999/xhtml" >
<head >
    <title>View state sample</title>
</head>
<body>
    <form id="form1" >
    <div>
    </div>
    </form>
</body>
</html>

<%@ Page Language="C#" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<script >
  // Sample ArrayList for the page.
  ArrayList PageArrayList;

  ArrayList CreateArray()
  {
    // Create a sample ArrayList.
    ArrayList result = new ArrayList(4);
    result.Add("item 1");
    result.Add("item 2");
    result.Add("item 3");
    result.Add("item 4");
    return result;
  }

  void Page_Load(object sender, EventArgs e)
  {
    if (ViewState["arrayListInViewState"] != null)
    {
      PageArrayList = (ArrayList)ViewState["arrayListInViewState"];
    }
    else
    {
      // ArrayList isn't in view state, so it must be created and populated.
      PageArrayList = CreateArray();
    }
    // Code that uses PageArrayList.
  }
    
  void Page_PreRender(object sender, EventArgs e)
  {
    // Save PageArrayList before the page is rendered.
    ViewState.Add("arrayListInViewState", PageArrayList);
  }
</script>

<html xmlns="http://www.w3.org/1999/xhtml" >
<head >
    <title>View state sample</title>
</head>
<body>
    <form id="form1" >
    <div>
    </div>
    </form>
</body>
</html>

Datentypen, die Sie im Ansichtszustand speichern können

Die folgenden Objekttypen können im Ansichtszustand gespeichert werden:

  • Zeichenfolgen

  • Ganze Zahlen

  • Boolean-Werte

  • Array-Objekte

  • ArrayList-Objekte

  • Hashtabellen

  • Benutzerdefinierte Typkonverter (weitere Informationen finden Sie in der TypeConverter-Klasse)

Andere Datentypen können ebenfalls gespeichert werden, die Klasse muss jedoch mit dem Serializable-Attribut kompiliert werden, sodass die Werte für den Ansichtszustand serialisiert werden können.

Lesen von Werten aus dem Ansichtszustand

Um einen Wert aus dem Ansichtszustand zu lesen, rufen Sie die ViewState-Eigenschaft der Seite auf und lesen anschließend den Wert aus dem Ansichtszustandswörterbuch.

Im folgenden Beispiel wird veranschaulicht, wie Sie das ArrayList-Objekt mit dem Namen arrayListInViewState aus dem Ansichtszustand abrufen und anschließend ein GridView-Steuerelement als Datenquelle an das Objekt binden können.

Dim arrayList As ArrayList
arrayList = CType(ViewState("arrayListInViewState"), ArrayList)

Me.GridView1.DataSource = arrayList
Me.GridView1.DataBind()

arrayList = new ArrayList();
arrayList = (ArrayList)ViewState["arrayListInViewState"];

this.GridView1.DataSource = arrayList;
this.GridView1.DataBind();

Werte im Ansichtszustand werden als String typisiert. Wenn Sie Option Strict On in Visual Basic festlegen, müssen Sie die Ansichtszustandswerte vor ihrer Verwendung in den geeigneten Typ umwandeln, wie im vorherigen Beispiel dargestellt. In C# müssen Sie immer in den geeigneten Typ umwandeln, wenn Sie die Ansichtszustandswerte lesen.

Wenn Sie versuchen, einen Wert aus einem nicht vorhandenen Ansichtszustand abzurufen, wird keine Ausnahme ausgelöst. Um sicherzustellen, dass der Wert im Ansichtszustand vorhanden ist, überprüfen Sie zuerst, ob das Objekt vorhanden ist. Im folgenden Beispiel ist die Überprüfung auf einen Ansichtszustandseintrag dargestellt.

If ViewState("color") Is Nothing Then
    ' No such value in view state, take appropriate action.
End If
if (ViewState["color"] == null)
    // No such value in view state, take appropriate action.

Wenn Sie versuchen, einen nicht vorhandenen Ansichtszustandseintrag auf andere Weise zu verwenden (beispielsweise, um seinen Typ zu untersuchen), wird eine NullReferenceException-Ausnahme ausgelöst.

Zurück nach oben

Sichern des Ansichtszustands

Standardmäßig werden Ansichtszustandsdaten in einem ausgeblendeten Feld in der Seite gespeichert und mit Base64 codiert. Außerdem wird mithilfe eines MAC-Schlüssels (Machine Authentication Code) ein Hashwert der Ansichtszustandsdaten erstellt. Der Hashwert wird den codierten Ansichtszustandsdaten hinzugefügt, und die daraus resultierende Zeichenfolge wird in der Seite gespeichert. Wenn die Seite an den Server zurückgesendet wird, berechnet das ASP.NET-Seitenframework den Hashwert erneut und vergleicht ihn mit dem im Ansichtszustand gespeicherten Wert. Falls die Hashwerte nicht übereinstimmen, wird eine Ausnahme ausgelöst, da die Ansichtszustandsdaten ungültig sein könnten.

Durch Erstellen des Hashwerts kann vom ASP.NET-Seitenframework getestet werden, ob die Ansichtszustandsdaten fehlerhaft sind oder manipuliert wurden. Auch wenn die Ansichtszustandsdaten nicht manipuliert wurden, können sie jedoch von böswilligen Benutzern abgefangen und gelesen werden.

Verwenden des MAC zum Berechnen des Hashwerts des Ansichtszustands

Der MAC-Schlüssel zum Berechnen des Hashwerts des Ansichtszustands wird entweder automatisch erstellt oder in der Datei Machine.config festgelegt. Wird der Schlüssel automatisch erstellt, wird dies auf der Grundlage der MAC-Adresse des Computers ausgeführt, bei der es sich um einen eindeutigen GUID-Wert des Netzwerkadapters für den jeweiligen Computer handelt.

Für böswillige Benutzer ist es schwierig, den MAC-Schlüssel auf der Grundlage des Hashwerts im Ansichtszustand mit Reverse Engineering-Techniken zu entschlüsseln. Die MAC-Codierung ist daher eine recht zuverlässige Möglichkeit, um zu bestimmen, ob die Ansichtszustandsdaten geändert wurden.

Grundsätzlich gilt: Je größer der zur Generierung des Hashwerts verwendete MAC-Schlüssel ist, desto unwahrscheinlicher ist es, dass zwei Hashwerte für unterschiedliche Zeichenfolgen identisch sind. Wenn der Schlüssel automatisch erstellt wird, verwendet ASP.NET die SHA1-Verschlüsselung, um einen großen Schlüssel zu erstellen. In einer Webfarmumgebung muss der Schlüssel jedoch auf allen Servern identisch sein. Wenn der Schlüssel nicht identisch ist und die Seite an einen anderen Server zurückgesendet wird, als den, der die Seite erstellt hat, löst das ASP.NET-Seitenframework eine Ausnahme aus. Daher sollten Sie in einer Webfarmumgebung einen Schlüssel in der Datei Machine.config festlegen, anstatt von ASP.NET automatisch einen Schlüssel generieren zu lassen. Beachten Sie in diesem Fall, dass der Schlüssel lang genug sein sollte, um eine ausreichende Sicherheit für den Hashwert zu gewährleisten. Je länger jedoch der Schlüssel ist, desto länger dauert es, einen Hash zu erstellen. Sie müssen daher Sicherheits- und Leistungsanforderungen abwägen.

Verschlüsseln des Ansichtszustands

Die MAC-Codierung verhindert zwar das Manipulieren der Ansichtszustandsdaten, jedoch nicht das Anzeigen der Daten durch Benutzer. Sie haben zwei Möglichkeiten, das Anzeigen der Daten zu verhindern: Sie können die Seite über SSL übermitteln oder die Ansichtszustandsdaten verschlüsseln. Zusätzlich kann Seitenanforderung über SSL Datenpaket-Sniffing und nicht autorisierten Datenzugriff durch Personen verhindern, für die die Seite nicht bestimmt ist.

Der die Seite anfordernde Benutzer kann jedoch trotzdem die Ansichtszustandsdaten anzeigen, da SSL die Seite zum Anzeigen im Browser entschlüsselt. Wenn von autorisierten Benutzern mit Zugriff auf die Ansichtszustandsdaten keine Gefahr ausgeht, ist dies akzeptabel. Es gibt jedoch Fälle, in denen Steuerelemente im Ansichtszustand Informationen speichern, auf die kein Benutzer zugreifen können sollte. Beispielsweise kann eine Seite ein datengebundenes Steuerelement enthalten, das Elementbezeichner (Datenschlüssel) im Ansichtszustand speichert. Wenn diese Bezeichner vertrauliche Daten wie beispielsweise Kunden-IDs enthalten, sollten die Ansichtszustandsdaten zusätzlich oder alternativ zur SSL-Übertragung verschlüsselt werden.

Zur Verschlüsselung der Daten legen Sie die ViewStateEncryptionMode-Eigenschaft der Seite auf true fest. Zum Speichern von Informationen im Ansichtszustand können normale Lese- und Schreibtechniken verwendet werden; die gesamte Ver- und Entschlüsselung wird von der Seite ausgeführt. Das Verschlüsseln der Ansichtszustandsdaten kann die Leistung Ihrer Anwendung beeinträchtigen. Verwenden Sie daher nur dann eine Verschlüsselung, wenn sie erforderlich ist.

Verschlüsselung des Steuerelementzustands

Steuerelemente, die den Steuerelementzustand verwenden, können eine Verschlüsselung des Ansichtszustands erfordern. Dies wird durch den Aufruf der RegisterRequiresViewStateEncryption-Methode mitgeteilt. Sobald für ein einzelnes Steuerelement auf der Seite die Verschlüsselung des Ansichtszustands erforderlich ist, wird der gesamte Ansichtszustand der Seite verschlüsselt.

Benutzerbezogene Verschlüsselung des Ansichtszustands

Wenn Sie für die Website die Benutzerauthentifizierung verwenden, können Sie durch Festlegen der ViewStateUserKey-Eigenschaft im Page_Init-Ereignishandler den Ansichtzustand der Seite einem bestimmten Benutzer zuordnen. Dadurch können One-Click-Angriffe verhindert werden, bei denen ein böswilliger Benutzer eine gültige, vollständig vorausgefüllte Webseite mit Ansichtszustandsdaten einer vorher erstellten Seite erstellt. Das Opfer wird vom Angreifer dazu gebracht, auf einen Link zu klicken, durch den die Seite mit der Identität des Opfers an den Server gesendet wird.

Wenn die ViewStateUserKey-Eigenschaft festgelegt wird, wird zum Erstellen des Hashwerts des Ansichtszustands der ursprünglichen Seite die Identität des Angreifers verwendet. Wenn das Opfer aufgrund von Täuschung die Seite zurücksendet, sind die Hashwerte unterschiedlich, da die Benutzerschlüssel unterschiedlich sind. Die Seite besteht die Überprüfung nicht, und eine Ausnahme wird ausgelöst.

Die ViewStateUserKey-Eigenschaft muss für den jeweiligen Benutzer einem eindeutigen Wert zugeordnet werden, beispielsweise dem Benutzernamen oder -bezeichner.

Sichern der Konfiguration in Umgebungen mit gemeinsamen Hostservern

In einer Umgebung mit gemeinsamen Hostservern können böswillige Benutzer möglicherweise Zustandsverwaltungseigenschaften manipulieren, die andere Anwendungen auf dem Computer betreffen. Dies kann durch direktes Manipulieren der Datei Machine.config durchgeführt werden, durch Manipulationen mithilfe der Konfigurationsklassen oder mit anderen Verwaltungs- und Konfigurationstools. Sie können Änderungen an Ihrer Anwendungskonfiguration verhindern, indem Sie Konfigurationsabschnitte oder -dateien verschlüsseln. Weitere Informationen finden Sie unter Verschlüsseln von Konfigurationsinformationen mithilfe der geschützten Konfiguration.

Klassenreferenz

ViewState

Stellt ein Wörterbuchobjekt bereit, um Werte für die gleiche Seite zwischen den Anforderungen beizubehalten.

PageStatePersister

Stellt eine Möglichkeit bereit, um einen benutzerdefinierten Mechanismus zum Speichern von Ansichtszustandsinformationen festzulegen, beispielsweise in einer SQL Server-Datenbank.

Zurück nach oben

Siehe auch

Konzepte

Übersicht über die ASP.NET-Zustandsverwaltung

Empfehlungen zur ASP.NET-Zustandsverwaltung

Referenz

Zurück nach oben