11.2 Der Status einer Seite: Viewstate
 
Bei der Arbeit mit Formularen haben Sie bereits gesehen, dass sich ASP.NET zwischen den Formularaufrufen den Status der Eingabefelder merkt und in den Antwortseiten diesen Status stets auch wiederherstellt. Für dieses Verfahren nutzt ASP.NET die Technik der versteckten Felder. In einem Formular finden Sie jeweils ein verstecktes Feld mit dem Namen __VIEWSTATE, das den Status der Steuerelemente dieser Seite in codierter Form speichert. Je mehr Steuerelemente und Eingaben ein Formular enthält, umso umfangreicher wird auch der Inhalt dieses versteckten __VIEWSTATE-Feldes. Die Inhalte des __VIEWSTATE-Feldes finden Sie auf der Serverseite – in decodierter Form – im StateBag-Objekt der Seite wieder.
11.2.1 Eigene Daten im Viewstate speichern
 
Als Entwickler können Sie auch Ihre eigenen Daten diesem codierten __VIEWSTATE-Feld hinzufügen. Die Page-Klasse bietet über ihre geschützte Eigenschaft ViewState den Zugriff auf das StateBag-Objekt der Seite. In diesen »Sack voller Zustände« können Sie auch problemlos Ihre selbst definierten Merkmale hineinwerfen und bei Gelegenheit wieder herausholen. Das StateBag-Objekt ist prinzipiell ein Dictionary. Einem Schlüssel, der vom Typ String ist, wird ein Wert vom Typ Object zugeordnet.
Die Verwendung des StateBag-Objekts über die ViewState-Eigenschaft der aspx-Seite bietet diese Vorteile:
|
Sie können nicht nur Strings, sondern beliebige serialisierbare Objekte speichern. |
|
Die gespeicherten Inhalte sind nicht im Klartext lesbar, sondern nur in codierter Form in der Seite enthalten. |
Diesen Vorteilen steht der Nachteil gegenüber, dass die Inhalte nach wie vor ständig hin- und hertransportiert werden müssen und eine entsprechende Netzbelastung erzeugen.
Als einfaches Beispiel für die Verwendung der ViewState-Eigenschaft bietet sich ein Zähler an. Gezählt wird, wie oft jemand diese Seite bereits aufgerufen hat. Es wird also nicht gezählt, wie oft eine Seite insgesamt von allen Browsern aufgerufen wurde, sondern nur, wie oft ein bestimmter Browser die Seite aufgerufen hat. viewstate01.aspx demonstriert das Verfahren und Abbildung 11.1 zeigt die Darstellung im Browser mit dem erzeugten HTML-Quellcode.
<!-- viewstate01.aspx -->
<%@ Page Language="VB" Debug="True" Strict="True" %>
<script runat="server">
Sub Page_Load (ByVal Sender As Object, _
ByVal E As EventArgs)
Dim myCounter As Integer
If ViewState("myCounter") Is Nothing Then
myCounter = 1
Else
myCounter = CInt(ViewState("myCounter"))
End If
ausgabe.innerText = CStr(myCounter)
myCounter += 1
ViewState("myCounter") = myCounter
End Sub
</script>
<html><head><title>Viewstate-Demo</title></head>
<body><h3>Viewstate-Demo</h3>
<form runat="server" id="myForm">
Das ist der <b runat="server" id="ausgabe"></b>.
Aufruf.<br><br>
<input type="submit" value="Weiterzählen" >
</form></body></html>
 Hier klicken, um das Bild zu Vergrößern
Abbildung 11.1 Jede Seite hat ein StateBag-Objekt dabei, in dem Sie auch Ihre eigenen Daten zwischenspeichern können.
Die Verwendung des Status-Sacks ist offenkundig denkbar einfach. Der Ausdruck ViewState("myCounter") greift auf den Eintrag mit dem Schlüssel "myCounter" zu. Wenn der Status-Sack keinen solchen Eintrag enthält, dann definiert die Prozedur den Eintrag "myCounter", initialisiert ihn mit dem Wert 1 und gibt diesen Wert zurück.
| Achtung Im Beispiel müssen Sie die Integer-Variable myCounter sauber von dem String "myCounter" unterscheiden, der den Schlüssel für den StateBag-Eintrag bietet. Sie könnten auch jeden anderen String als Schlüssel verwenden. Es soll lediglich der Übersichtlichkeit dienen, dass der Schlüssel den gleichen Namen hat wie die verwendete Variable.
|
Da der Ausdruck ViewState("myCounter") eine Object-Variable zurückgibt, muss für die Zuweisung zur Integer-Variablen ausdrücklich konvertiert werden:
myCounter = CInt(ViewState("myCounter"))
Entsprechendes gilt auch für die Zuweisung zum Text:
ausgabe.innerText = CStr(myCounter)
Die Konvertierungen sind nötig, da die Seite die Option Strict verwendet.
| Name
|
Typ
|
Beschreibung
|
| Eigenschaften
|
| Count
|
Integer
|
Anzahl der StateItem-Objekte im StateBag-Objekt
|
| Item(String)
|
Object
|
Default-Eigenschaft. Liefert den jeweiligen Wert. Der Schlüssel wird als String übergeben.
|
| Keys
|
ICollection
|
Auflistung der Schlüssel. Lässt sich mit StateBag.GetEnumerator durchlaufen
|
| Values
|
ICollection
|
Auflistung der Werte
|
| Methoden
|
| Add (String, Object)
|
StateItem
|
Fügt einen neuen Eintrag hinzu
|
| Clear
|
|
Entfernt alle Einträge
|
| GetEnumerator
|
IDictionaryEnumerator
|
Gibt einen Enumerator zurück, der alle Schlüssel-Wert-Paare durchläuft
|
| IsItemDirty
|
Boolean
|
Überprüft einen StateBag-Eintrag, um auszuwerten, ob er seit dem Aufruf von Control.TrackViewState geändert wurde
|
| Remove(String)
|
|
Entfernt den Eintrag mit dem als String übergebenen Schlüssel
|
Tabelle 11.1 Eigenschaften und Methoden des StateBag-Objekts
11.2.2 Den Anzeigestatus ein- und ausschalten
 
Wenn eine Anwendung sich den Anzeigestatus merkt, dann nutzt sie Ressourcen auf dem Server und sie verbraucht Übertragungskapazität. Unter Umständen ist der Erhalt des Zustands aber nicht erforderlich. Ein Beispiel sind Listensteuerelemente, deren Inhalt stets aus einer Datenbank gelesen wird. Wenn Sie für dieses Steuerelement zusätzlich den Anzeigestatus speichern, erzeugen Sie je nach Länge der Liste unter Umständen eine erhebliche Netzbelastung.
Sie haben verschiedene Möglichkeiten, den Anzeigestatus ein- oder auszuschalten. Sie können den Viewstate für eine komplette Seite deaktivieren, indem Sie in der Page-Direktive das Attribut EnableViewState="false" angeben:
<%@ Page Language="VB" EnableViewState="false" %>
Außerdem können Sie den Viewstate über die Eigenschaft EnableViewState gezielt für einzelne Steuerelemente ein- und ausschalten. Diese Eigenschaft gilt dann für das jeweilige Element und alle anderen Elemente, die in ihm enthalten sind.
|