Das Hypertext Transfer Protocol (HTTP) ist ein zustandsloses Protokoll. Wenn der Client die Verbindung zum Server trennt, verwirft die ASP.NET-Engine das Seitenobjekt. Auf diese Weise kann jede Webanwendung so skaliert werden, dass sie eine große Anzahl von Anforderungen gleichzeitig bedienen kann, ohne den Serverspeicher zu erschöpfen.
Es sind jedoch einige Techniken erforderlich, um die Informationen zwischen Anfragen zu speichern und bei Bedarf abzurufen. Diese Informationen werden als Status bezeichnet. Dabei handelt es sich um die aktuellen Werte aller Steuerelemente und Variablen, die der aktuelle Benutzer in der aktuellen Sitzung verwendet.
ASP.NET verwaltet vier Zustände:
Zustand anzeigen
Kontrollzustand
Sitzungsstatus
Bewerbungsstatus
Der Ansichtsstatus ist der Status der Seite und aller ihrer Steuerelemente. Es bleibt durch das Feedback des ASP.NET-Frameworks unverändert.
Wenn eine Seite an den Client zurückgesendet wird, werden die Eigenschaften und Steuerelemente dieser Seitenänderungen ermittelt und im Wert eines versteckten Eingabefelds namens _VIEWSTATE gespeichert. Wenn die Seite erneut gepostet wird, wird das Feld _VIEWSTATE mit der HTTP-Anfrage an den Server gesendet.
Der Ansichtsstatus kann aktiviert oder deaktiviert werden für:
Ganze Anwendung : Legen Sie die EnableViewState-Eigenschaft des Abschnitts in der Datei web.config fest.
Eine Seite : Setzen Sie die EnableViewState-Eigenschaft des Seitenbefehls auf <%@ Page Language="C#" EnableViewState="false" %>
Ein Steuerelement : Legen Sie die Eigenschaft control.EnableViewState fest.
Hierzu wird ein Ansichtszustandsobjekt verwendet, das durch eine StateBag-Klasse definiert wird, die durch eine Reihe von Ansichtszustandselementen definiert wird. Der StateBag ist eine Datenstruktur, die Eigenschaftswertpaare enthält und als einem Objekt zugeordnete Zeichenfolge gespeichert wird.
Die StateBag-Klasse verfügt über die folgenden Eigenschaften:
Eigentum | beschreiben |
---|---|
Artikel(Name) | Der Wert des Ansichtszustands mit dem angegebenen Namen, der die Standardeigenschaft des StateBag ist. |
Zählen | Der Name des Elements in der Statussammlung. |
Schlüssel | Eine Sammlung von Schlüsseln für alle Elemente in der Sammlung. |
Werte | Die Sammlung von Werten für alle Elemente in der Sammlung. |
Die StateBag-Klasse verfügt über die folgenden Methoden:
Verfahren | beschreiben |
---|---|
Add(Name, Wert) | Fügt ein Element zur Viewstate-Sammlung hinzu und aktualisiert vorhandene Elemente. |
Klar | Entfernt alle Elemente aus der Sammlung. |
Ist gleich(Objekt) | Bestimmt, ob das angegebene Objekt gleich dem aktuellen Objekt ist. |
Abschließen | Ermöglicht die Freigabe von Ressourcen und die Durchführung anderer Bereinigungsvorgänge. |
GetEnumerator | Gibt einen Zähler von Schlüssel/Wert-Paaren für doppelte StateItem-Objekte zurück, die im StateBag-Objekt gespeichert sind. |
GetType | Rufen Sie den Typ der aktuellen Instanz ab. |
IsItemDirty | Überprüfen Sie das im StateBag gespeicherte Objekt, um zu bestätigen, ob es geändert wurde. |
Entfernen(Name) | Benutzerdefinierte Elemente entfernen. |
SetDirty | Legt den Status des StateBag-Objekts und der Dirty-Eigenschaft jedes enthaltenen StateItem-Objekts fest. |
SetItemDirty | Legt die Dirty-Eigenschaft für das angegebene StateItem-Objekt im StateBag-Objekt fest. |
ToString | Gibt eine Zeichenfolge zurück, die das Statuspaketobjekt darstellt. |
Das folgende Beispiel veranschaulicht das Konzept von Zeichenfolgen, die den Ansichtsstatus speichern.
Lassen Sie uns einen Zähler behalten, der jedes Mal erhöht werden kann, wenn die Seite durch Klicken auf eine Schaltfläche auf der Seite erneut aufgerufen wird. Das Etikettensteuerelement zeigt den Wert des Zählers an.
Der Code der Tag-Datei sieht folgendermaßen aus:
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="statedemo._Default" %><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml" > <head runat="server"> <title> Untitled Page </title> </head> <body> <form id="form1" runat="server"> <div> <h3>View State demo</h3> Page Counter: <asp:Label ID="lblCounter" runat="server" /> <asp:Button ID="btnIncrement" runat="server" Text="Add Count" onclick="btnIncrement_Click" /> </div> </form> </body></html>
Die Code-Behind-Datei für diese Instanz sieht folgendermaßen aus:
public partial class _Default : System.Web.UI.Page{ public int counter { get { if (ViewState["pcounter"] != null) { return ((int)ViewState["pcounter"]); } else { return 0; } } set { ViewState["pcounter"] = value; } } protected void Page_Load(object sender, EventArgs e) { lblCounter.Text = counter.ToString(); counter++; }}
Es werden folgende Ergebnisse erzielt:
Steuerzustände können nicht direkt geändert, abgerufen oder deaktiviert werden.
Wenn ein Benutzer eine Verbindung zu einer ASP.NET-Website herstellt, wird ein neues Sitzungsobjekt erstellt. Wenn der Sitzungsstatus aktiviert ist, wird für jede neue Anfrage ein neuer Sitzungsstatus erstellt. Dieses Sitzungsstatusobjekt wird Teil der Laufzeitumgebung und ist über die Seite verfügbar.
Der Sitzungsstatus wird normalerweise zum Speichern von Anwendungsdaten wie Inventar, Lieferantenlisten, Kundendatensätzen oder Einkaufswagen verwendet. Es kann die Informationen des Benutzers und seine Präferenzinformationen speichern und den unentschlossenen Pfad des Benutzers speichern.
Sitzungen werden durch eine 120-Bit-Sitzungs-ID identifiziert und verfolgt, vom Client an den Server übergeben und als Cookie oder geänderte URL zurückgegeben. SessionID ist weltweit eindeutig und zufällig.
Sitzungsstatusobjekte werden von der HttpSessionState-Klasse erstellt, die eine Sammlung von Sitzungsstatuselementen definiert.
Die HttpSessionState-Klasse verfügt über die folgenden Eigenschaften:
Eigentum | beschreiben |
---|---|
Sitzungs-ID | Eindeutige Sitzungskennung. |
Artikel(Name) | Der Wert des Sitzungsstatuselements mit dem angegebenen Namen, der die Standardeigenschaft der HttpSessionState-Klasse ist. |
Zählen | Die Anzahl der Elemente in der Sitzungsstatussammlung. |
Time-out | Ruft die Zeitspanne (in Minuten) ab, die zwischen Anforderungen zulässig ist, bevor der Anbieter den Sitzungsstatus stoppt, und legt diese fest. |
Die HttpSessionState-Klasse verfügt über die folgenden Methoden:
Verfahren | beschreiben |
---|---|
Add(Name, Wert) | Fügt der Sitzungsstatussammlung neue Elemente hinzu. |
Klar | Entfernt alle Elemente aus der Sitzungsstatussammlung. |
Entfernen(Name) | Entfernt das angegebene Element aus der Sitzungsstatussammlung. |
Alles entfernen | Entfernt alle Schlüssel und Werte aus der Sitzungsstatussammlung. |
RemoveAt | Entfernt das Element am angegebenen Index aus der Sitzungsstatussammlung. |
Ein Sitzungsstatusobjekt ist ein Name-Wert-Paar, das Informationen von einem Sitzungsstatusobjekt speichern und abrufen kann. Ebenso können Sie den folgenden Code verwenden:
void StoreSessionInfo(){ String fromuser = TextBox1.Text; Session["fromuser"] = fromuser;}void RetrieveSessionInfo(){ String fromuser = Session["fromuser"]; Label1.Text = fromuser;}
Der obige Code speichert nur Zeichenfolgen im Sitzungswörterbuchobjekt, er kann jedoch alle primitiven Datentypen und Arrays speichern, die aus primitiven Datentypen, DataSet-, DataTable-, HashTable- und Bildobjekten bestehen, sowie alle benutzerdefinierten Objekte, die erben ISerialisierbare Objekte.
Das folgende Beispiel veranschaulicht das Konzept der Speicherung des Sitzungsstatus. Auf der Seite gibt es zwei Schaltflächen: eine Textfeld-Schaltfläche zum Eingeben einer Zeichenfolge und eine Beschriftungsschaltfläche zum Anzeigen des in der letzten Sitzung gespeicherten Textes. Der Code der Tag-Datei sieht folgendermaßen aus:
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml" > <head runat="server"> <title> Untitled Page </title> </head> <body> <form id="form1" runat="server"> <div> <table> <tr> <td> <asp:Label ID="lblstr" runat="server" Text="Enter a String" > </asp:Label> </td> <td> <asp:TextBox ID="txtstr" runat="server"> </asp:TextBox> </td> </tr> <tr> <td> </td> <td> </td> </tr> <tr> <td> <asp:Button ID="btnnrm" runat="server" Text="No action button" /> </td> <td> <asp:Button ID="btnstr" runat="server" OnClick="btnstr_Click" Text="Submit the String" /> </td> </tr> <tr> <td> </td> <td> </td> </tr> <tr> <td> <asp:Label ID="lblsession" runat="server" > </asp:Label> </td> <td> </td> </tr> <tr> <td> <asp:Label ID="lblshstr" runat="server"> </asp:Label> </td> <td> </td> </tr> </table> </div> </form> </body></html>
In der Designansicht sollte es so aussehen:
Der Hintergrundcode lautet wie folgt:
public partial class _Default : System.Web.UI.Page { String mystr; protected void Page_Load(object sender, EventArgs e) { this.lblshstr.Text = this.mystr; this.lblsession.Text = (String)this.Session["str"]; } protected void btnstr_Click(object sender, EventArgs e) { this.mystr = this.txtstr.Text; this.Session["str"] = this.txtstr.Text; this.lblshstr.Text = this.mystr; this.lblsession.Text = (String)this.Session["str"]; }}
Führen Sie die Datei aus und beobachten Sie, wie sie ausgeführt wird:
Eine ASP.NET-Anwendung ist eine Sammlung aller Webseiten, Codes und anderer Dateien in einem einzigen virtuellen Verzeichnis auf einem Webserver. Wenn Informationen im Anwendungsstatus gespeichert werden, stehen sie allen Benutzern zur Verfügung.
Um die Verwendung des Anwendungsstatus zu ermöglichen, erstellt ASP.NET für jede Anwendung ein Anwendungsstatusobjekt aus der HttpApplicationState-Klasse und speichert das Objekt im Serverspeicher. Dieses Objekt wird durch die Klassendatei global.asax repräsentiert.
Der Anwendungsstatus wird hauptsächlich zum Speichern von Zählern, anderen statistischen Daten und allen Anwendungsdaten wie Steuersätzen und Rabattsätzen sowie zum Speichern des Pfads des Benutzers zur Website verwendet.
Die HttpApplicationState-Klasse verfügt über die folgenden Eigenschaften:
Eigentum | beschreiben |
---|---|
Artikel(Name) | Der Wert des Anwendungseintrags mit dem angegebenen Namen, der die Standardeigenschaft von HttpApplicationState ist. |
Zählen | Die Anzahl der Elemente in der Anwendungsstatussammlung. |
Die HttpApplicationState-Klasse verfügt über die folgenden Methoden:
Verfahren | beschreiben |
---|---|
Add(Name, Wert) | Fügt der Anwendungsstatussammlung neue Elemente hinzu. |
Klar | Entfernt alle Elemente aus der Anwendungsstatussammlung. |
Entfernen(Name) | Entfernt das angegebene Element aus der Anwendungsstatussammlung. |
Alles entfernen | Entfernt alle Objekte in einer HttpApplicationState-Sammlung. |
RemoveAt | Entfernt ein HttpApplicationState-Objekt aus der vom Index gefundenen Sammlung. |
Sperren() | Sperren Sie die Anwendungsstatussammlung, sodass nur der aktuelle Benutzer darauf zugreifen kann. |
Unlock() | Entsperren Sie die Sammlung des Anwendungsstatus, damit alle Benutzer darauf zugreifen können. |
Anwendungsstatusdaten werden normalerweise von Handlern verwaltet, die für Ereignisse geschrieben wurden:
Anwendung wird geöffnet
Die Bewerbung endet
Anwendungsfehler
Sitzung beginnt
Sitzung beendet
Der folgende Codeausschnitt zeigt die grundlegende Syntax zum Speichern von Anwendungsstatusinformationen:
Void Application_Start(object sender, EventArgs e){ Application["startMessage"] = "The application has started.";}Void Application_End(object sender, EventArgs e){ Application["endtMessage"] = "The application has ended.";}