ASP.NET-Zustandsdaten (ViewState)

Ein ASP.NET-Control kann Zustandsdaten clientseitig speichern. Bei jeder Postback-Anfrage werden die clientseitig abgelegten Daten wieder übermittelt und können serverseitig ausgewertet werden. Auf diese Art und Weise abgelegte Zustandsdaten entlasten den Server, da für die Dauer der Session kein Serverspeicher belegt werden muss. Allerdings müssen die Zustandsdaten bei jeder Postback-Serveranfrage und bei jeder Serverantwort übermittelt werden.

Vorteile

  • Keine Belegung von Serverspeicher
  • Zustandsdaten gehören immer zu genau einem Fenster
  • Unterscheidung aller Fenster einer Session möglich

Nachteile

  • Zustandsdaten müssen immer serialisierbar, also speicherbar sein
  • Übertragung der Daten bei jeder Postback-Serveranfrage und Serverantwort
  • Datenverlust bei POST-Anfragen über anderes Formular
  • Datenverlust bei GET-Anfragen

Verfügbarkeit

Zustandsdaten stehen erst nach dem Laden aller Postback-Werte zur Verfügung. Der Zeitpunkt entspricht im Lebenszyklus der ASP.NET-Seite dem Aufruf der virtuellen Funktion OnLoadComplete. Änderungen können spätestens bis zum Aufruf der virtuellen Funktion OnPreRenderComplete durchgeführt werden. Danach erfolgt die Ausgabe der Zustandsdaten. Dafür wird ein verstecktes Eingabeelement verwendet (Hidden Field).

Beispiel

Die folgende ASP.NET-Beispielkomponente benutzt einen ViewState-basierten Zähler, der bei jeder Anfrage erhöht und ausgegeben wird.

using System;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace Liersch.WebExamples
{
  public class ExampleWebControl : WebControl
  {
    int Counter
    {
      get
      {
        object obj=ViewState["Counter"];
        if(obj!=null)
          return (int)obj;
        return 0; // Default value
      }
      set
      {
        ViewState["Counter"]=value;
      }
    }

    protected override void OnPreRender(EventArgs e)
    {
      base.OnPreRender(e);
      if(!DesignMode)
        Counter++; // Change ViewState-based value
    }

    protected override void Render(HtmlTextWriter writer)
    {
      base.Render(writer);
      if(DesignMode)
      {
        writer.Write(ID);
      }
      else
      {
        // Write ViewState-based value
        writer.Write("Counter: ");
        writer.Write(Counter);
      }
    }
  }
}

Ähnliche Artikel

Schreiben Sie einen Kommentar