Steuern des Anzeigezustands
Aktualisiert: November 2007
Microsoft ASP.NET-Webseiten können ihren Zustand über mehrere Schleifen beibehalten. Wenn eine Eigenschaft für ein Steuerelement festgelegt ist, speichert ASP.NET den Eigenschaftenwert als Teil des Zustands des Steuerelements. Für die Anwendung entsteht der Eindruck, dass sich die Lebensdauer der Seite über mehrere Clientanforderungen erstreckt. Dieser Zustand auf Seitenebene wird als Ansichtszustand der Seite bezeichnet.
Bei normalen ASP.NET-Webseiten wird der Ansichtszustand vom Server als ausgeblendetes Feld in einem Formular als Teil der Antwort an den Client gesendet und vom Client an den Server als Teil eines Postbacks zurückgegeben. Um die benötigte Bandbreite bei der Verwendung von mobilen Steuerelementen zu verringern, sendet ASP.NET jedoch nicht den Anzeigezustand einer Seite an den Client. Der Ansichtszustand wird stattdessen als Teil einer Benutzersitzung auf dem Server gespeichert. Wenn ein Ansichtszustand vorhanden ist, sendet ASP.NET ein ausgeblendetes Feld, das den Ansichtszustand der Seite angibt, als Teil jeder Antwort an den Client, und das ausgeblendete Feld wird vom Client als Teil der nächsten Postback an den Server zurückgegeben.
Verwalten des Anzeigezustandverlaufs
Da der Ansichtszustand für eine angegebene Seite auf dem Server bleiben muss, ist es möglich, dass der aktuelle Zustand auf dem Server nicht synchron mit der aktuellen Seite des Browser ist, wenn der Benutzer im Browser auf die Schaltfläche Zurück klickt. Angenommen, der Benutzer öffnet zum Beispiel Seite 1, klickt dann auf eine Schaltfläche, um zu Seite 2 zu wechseln, und klickt dann auf Zurück, um wieder zu Seite 1 zu wechseln. Die aktuelle Seite im Browser ist nun Seite 1, der aktuelle Zustand auf dem Server ist jedoch der von Seite 2.
Um dieses Problem zu lösen, verwalten ASP.NET Mobile-Webseiten in der Benutzersitzung den Verlauf der Ansichtszustandsinformationen. Jeder an den Client gesendete Bezeichner entspricht einer Position in diesem Verlauf. Wenn der Benutzer im vorhergehenden Beispiel wieder von Seite 1 sendet, verwendet die mobile Webseite den mit Seite 1 gespeicherten Bezeichner, um den Verlauf des Ansichtszustands zu synchronisieren.
Sie können diese Verlaufsgröße konfigurieren, um die Anwendung genau darauf abzustimmen. Die Standardgröße ist 6. Sie kann in der Datei Web.config durch das Hinzufügen eines numerischen Attributs zu einem Tag geändert werden, wie im folgenden Beispiel gezeigt.
<configuration>
<system.web>
<mobileControls sessionStateHistorySize="10" />
</system.web>
</configuration>
Verwalten von abgelaufenen Sitzungen
Da der Anzeigezustand in der Benutzersitzung gespeichert wird, kann der Anzeigezustand ablaufen, wenn die Seite nicht innerhalb der Ablaufzeit der Sitzung mit einem Postback zurückgesendet wird. Diese Ablaufzeit ist für mobile Webseiten eindeutig. Wenn der Benutzer eine Seite sendet, für die kein Ansichtszustand verfügbar ist, wird die OnViewStateExpire-Methode der Seite aufgerufen. Die Standardimplementierung dieser Methode löst eine Ausnahme aus, die angibt, dass der Ansichtszustand abgelaufen ist. Wenn in einer Anwendung jedoch der Ansichtszustand nach dem Ablauf manuell wiederhergestellt werden kann, können Sie diese Methode auf Seitenebene überschreiben und entscheiden, die Basisimplementierung nicht aufzurufen.
Aktivieren und Deaktivieren des Anzeigezustands
Der Vorteil, den Ansichtszustand mithilfe der Sitzung zu verwalten, liegt in einer kleineren Antwortgröße. Der Nachteil liegt darin, dass eine ineffiziente Verwendung des Sitzungszustands zu verringerter Leistung führen kann. Wenn Sie Steuerelemente mit großen Datenmengen verwenden, können Sie die Effizienz mit Techniken wie benutzerdefiniertem Paging oder dem Deaktivieren des Ansichtszustands verbessern. Betrachten Sie zum Beispiel einmal eine Site mit Nachrichtenmeldungen. Anstatt den Artikelinhalt für jede Benutzersitzung zu speichern, kann die Site einen intelligenteren Zugriff auf die Daten verwenden, sodass nur eine Kopie pro Artikel auf dem Server zwischengespeichert und die Verwendung des Sitzungszustands minimiert wird.
Wenn Sie den Ansichtszustand für ein Steuerelement und die untergeordneten Steuerelemente deaktivieren möchten, legen Sie die EnableViewState-Eigenschaft des Steuerelements auf false fest. Um den Ansichtszustand für eine komplette Seite zu deaktivieren, legen Sie das EnableViewState-Attribut der @ Page-Direktive auf false fest.
Auch wenn der Anzeigezustand deaktiviert ist, speichern einige mobile Steuerelemente wichtige Zustandsinformationen zwischen Clientschleifen. Ein Beispiel für solche Informationen ist das aktuelle Formular auf einer Seite. Wenn Sie den Anzeigezustand deaktivieren, speichert die Seite diese wichtigen Informationen als ausgeblendete Formularvariable, die in einer Schleife an den Client gesendet wird.
Verwalten von Cookies und Clientzustand
Standardmäßig erfordern die ASP.NET-Features für die Sitzungsverwaltung, dass der Server ein Sitzungscookie an den Client ausgibt. Der Client sendet anschließend das Cookie bei jeder Anforderung während der Sitzung, und der Server ermittelt die Informationen zum Sitzungszustand anhand der Cookie-Informationen. Viele mobile Geräte unterstützen allerdings keine Cookies. Damit die Sitzungsverwaltung (einschließlich des Ansichtszustands) auf diesen Geräten ordnungsgemäß funktioniert, müssen Sie die Anwendung für die Sitzungsverwaltung ohne Cookies konfigurieren. Wenn dieses Feature aktiviert ist, fügt ASP.NET automatisch den Sitzungsschlüssel in Anwendungs-URLs ein.
Einige Geräte unterstützen keine Cookies. Um den Clientzustand langfristig zu erhalten, kann eine Anwendung clientspezifische Informationen verwenden, zum Beispiel eine Kundennummer, die der Benutzer eingibt. Da Sie nicht davon ausgehen können, dass ein Client über Cookies verfügt, muss die Anwendung Sie zu einer anderen Seite weiterleiten, die mit einem Lesezeichen versehen werden kann. Dazu finden Sie im Folgenden ein Beispiel. Benutzern, die zu dieser URL navigieren, wird ein Formular angezeigt, in dem sie ihre Kunden-ID eingeben können. Die Anwendung zeigt dann eine andere URL an, die die Benutzer mit einem Lesezeichen versehen können.
<%@ Page Inherits="System.Web.UI.MobileControls.MobilePage"
Language="C#"
EnableViewState="false" %>
<script language="c#">
protected void Page_Load(Object sender, EventArgs e)
{
String customerID = Request.QueryString["cid"];
if (customerID != null)
{
// A customer ID was found. Simulate a lookup by
// converting the client ID back to a user.
int underscore = customerID.IndexOf('_');
if (underscore != -1)
{
// If visiting the first time, prompt the user to bookmark.
if (Session["FirstTime"] != null)
{
Session["FirstTime"] = null;
WelcomeLabel.Text = String.Format("Welcome, {0}",
customerID.Substring(0, underscore));
ActiveForm = WelcomeForm;
}
else
{
ReturnLabel.Text = String.Format("Welcome back, {0}",
customerID.Substring(0, underscore));
ActiveForm = ReturnForm;
}
}
}
}
protected void LoginForm_OnSubmit(Object sender, EventArgs e)
{
// Generate a customer ID. Normally, you would create
// a new customer profile.
String customerID = CustomerName.Text + "_" +
System.Guid.NewGuid().ToString();
String path = AbsoluteFilePath + "?cid=" +
Server.UrlEncode(customerID);
Session["FirstTime"] = true;
RedirectToMobilePage(path);
}
</script>
<mobile:Form >
<mobile:Label StyleReference="title">
Welcome to the site. Please register to continue.
</mobile:Label>
<mobile:TextBox id="CustomerName" />
<mobile:Command OnClick="LoginForm_OnSubmit"
Text="Register" />
</mobile:Form>
<mobile:Form id="WelcomeForm" >
<mobile:Label id="WelcomeLabel" />
Please bookmark this page for future access.
</mobile:Form>
<mobile:Form id="ReturnForm" >
<mobile:Label id="ReturnLabel" />
</mobile:Form>
Optimieren des Anzeigezustands für mobile Anwendungen
Für mobile Webseiten sind folgende Aspekte wichtig:
Das Speichern des Ansichtszustands zum Sitzungszustand wird stark optimiert. Wenn kein Ansichtszustand zum Speichern vorhanden ist, wird in der Sitzung nichts gespeichert, und an den Client wird kein Bezeichner gesendet. Anwendungsentwickler, die keine Sitzungsverwaltung verwenden oder für hohen Durchsatz geeignete Seiten möchten, können die Verwendung des Anzeigezustands reduzieren oder ganz unterdrücken. In zahlreichen Anwendungsfällen (z. B. beim Rendern einer Seite mit formatiertem Text) ist der Anzeigezustand nicht erforderlich und wird am besten deaktiviert.
Zusätzlich zum Ansichtszustand von Anwendungen muss eine mobile Webseite weitere Arten von Zustandsinformationen über die Seite speichern. Zu diesen Informationen können das aktive Formular oder Informationen über die Paginierung des Formulars gehören. Diese Informationen werden immer an den Client gesendet und nicht auf dem Server gespeichert. Normalerweise werden sie in einem optimierten Verfahren generiert. Wenn z. B. das erste Formular aktiv ist oder die erste Seite eines Formulars angezeigt wird, werden diese Informationen nicht gespeichert, da es sich um Standardzustände handelt. Diese Zustandsinformationen werden als privater Anzeigezustand bezeichnet. Alle Steuerelemente können zum Lesen und Schreiben des privaten Ansichtszustands die LoadPrivateViewState-Methode und die SavePrivateViewState-Methode überschreiben.
Hinweis: Aus Sicherheitsgründen sollten Sie eine Verbindung mit HTTPS und SSL/TLS-Authentifizierung verwenden, wenn der Sitzungszustand vertrauliche Informationen enthält.
Siehe auch
Konzepte
Übersicht über die ASP.NET-Zustandsverwaltung
Referenz
Weitere Ressourcen
Unterstützen des Ansichtszustands