{"id":14,"date":"2009-10-29T21:17:06","date_gmt":"2009-10-29T20:17:06","guid":{"rendered":"http:\/\/www.steffen-liersch.de\/content\/de\/?p=14"},"modified":"2025-03-02T11:32:44","modified_gmt":"2025-03-02T10:32:44","slug":"asp-viewstate","status":"publish","type":"post","link":"https:\/\/www.steffen-liersch.de\/content\/de\/2009\/10\/asp-viewstate\/","title":{"rendered":"ASP.NET-Zustandsdaten (ViewState)"},"content":{"rendered":"<p>Ein ASP.NET-Control kann Zustandsdaten clientseitig speichern. Bei jeder Postback-Anfrage werden die clientseitig abgelegten Daten wieder \u00fcbermittelt und k\u00f6nnen serverseitig ausgewertet werden.<!--more--> Auf diese Art und Weise abgelegte Zustandsdaten entlasten den Server, da f\u00fcr die Dauer der Session kein Serverspeicher belegt werden muss. Allerdings m\u00fcssen die Zustandsdaten bei jeder Postback-Serveranfrage und bei jeder Serverantwort \u00fcbermittelt werden.<\/p>\n<h2>Vorteile<\/h2>\n<ul>\n<li>Keine Belegung von Serverspeicher<\/li>\n<li>Zustandsdaten geh\u00f6ren immer zu genau einem Fenster<\/li>\n<li>Unterscheidung aller Fenster einer Session m\u00f6glich<\/li>\n<\/ul>\n<h2>Nachteile<\/h2>\n<ul>\n<li>Zustandsdaten m\u00fcssen immer serialisierbar, also speicherbar sein<\/li>\n<li>\u00dcbertragung der Daten bei jeder Postback-Serveranfrage und Serverantwort<\/li>\n<li>Datenverlust bei POST-Anfragen \u00fcber anderes Formular<\/li>\n<li>Datenverlust bei GET-Anfragen<\/li>\n<\/ul>\n<h2>Verf\u00fcgbarkeit<\/h2>\n<p>Zustandsdaten stehen erst nach dem Laden aller Postback-Werte zur Verf\u00fcgung. Der Zeitpunkt entspricht im Lebenszyklus der ASP.NET-Seite dem Aufruf der virtuellen Funktion OnLoadComplete. \u00c4nderungen k\u00f6nnen sp\u00e4testens bis zum Aufruf der virtuellen Funktion OnPreRenderComplete durchgef\u00fchrt werden. Danach erfolgt die Ausgabe der Zustandsdaten. Daf\u00fcr wird ein verstecktes Eingabeelement verwendet (Hidden Field).<\/p>\n<h2>Beispiel<\/h2>\n<p>Die folgende ASP.NET-Beispielkomponente benutzt einen ViewState-basierten Z\u00e4hler, der bei jeder Anfrage erh\u00f6ht und ausgegeben wird.<\/p>\n<pre><code class=\"cs\">using System;\r\nusing System.Web.UI;\r\nusing System.Web.UI.WebControls;\r\n\r\nnamespace Liersch.WebExamples\r\n{\r\n  public class ExampleWebControl : WebControl\r\n  {\r\n    int Counter\r\n    {\r\n      get\r\n      {\r\n        object obj=ViewState[\"Counter\"];\r\n        if(obj!=null)\r\n          return (int)obj;\r\n        return 0; \/\/ Default value\r\n      }\r\n      set\r\n      {\r\n        ViewState[\"Counter\"]=value;\r\n      }\r\n    }\r\n\r\n    protected override void OnPreRender(EventArgs e)\r\n    {\r\n      base.OnPreRender(e);\r\n      if(!DesignMode)\r\n        Counter++; \/\/ Change ViewState-based value\r\n    }\r\n\r\n    protected override void Render(HtmlTextWriter writer)\r\n    {\r\n      base.Render(writer);\r\n      if(DesignMode)\r\n      {\r\n        writer.Write(ID);\r\n      }\r\n      else\r\n      {\r\n        \/\/ Write ViewState-based value\r\n        writer.Write(\"Counter: \");\r\n        writer.Write(Counter);\r\n      }\r\n    }\r\n  }\r\n}<\/code><\/pre>\n","protected":false},"excerpt":{"rendered":"<p>Ein ASP.NET-Control kann Zustandsdaten clientseitig speichern. Bei jeder Postback-Anfrage werden die clientseitig abgelegten Daten wieder \u00fcbermittelt und k\u00f6nnen serverseitig ausgewertet werden.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[5],"tags":[22],"class_list":["post-14","post","type-post","status-publish","format-standard","hentry","category-net","tag-asp-net"],"_links":{"self":[{"href":"https:\/\/www.steffen-liersch.de\/content\/de\/wp-json\/wp\/v2\/posts\/14","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.steffen-liersch.de\/content\/de\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.steffen-liersch.de\/content\/de\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.steffen-liersch.de\/content\/de\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.steffen-liersch.de\/content\/de\/wp-json\/wp\/v2\/comments?post=14"}],"version-history":[{"count":15,"href":"https:\/\/www.steffen-liersch.de\/content\/de\/wp-json\/wp\/v2\/posts\/14\/revisions"}],"predecessor-version":[{"id":413,"href":"https:\/\/www.steffen-liersch.de\/content\/de\/wp-json\/wp\/v2\/posts\/14\/revisions\/413"}],"wp:attachment":[{"href":"https:\/\/www.steffen-liersch.de\/content\/de\/wp-json\/wp\/v2\/media?parent=14"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.steffen-liersch.de\/content\/de\/wp-json\/wp\/v2\/categories?post=14"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.steffen-liersch.de\/content\/de\/wp-json\/wp\/v2\/tags?post=14"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}