ViewState is een pijn...er, Ik heb gezegd het! Wat veroorzaakt de meeste pijn met ViewState is het feit dat mensen misbruik maken van het veel, waardoor het ingeschakeld voor elke controle in een pagina, terwijl in feite je alleen echt nodig hebt voor die ene controle die echt moet blijven het inhoud naar de volgende pagina. Dave Reed een ontwikkelaar in het ASP.NET team heeft een echt epische post geschreven op Waarlijk begrijpen van ViewState, en voordat je leest wat er nu komt, moet je echt weggaan en dat eerst lezen
Terug?
Ok, goed nu begrijp je dat je alleen ViewState moet gebruiken voor die controles die het eigenlijk nodig hebben. Maar er is een probleem...wat je echt graag doet is uitschakelen ViewState voor een hele pagina dan gewoon weer aan te zetten voor de controles die deze nodig hebben; Sorry, maar ik heb slecht nieuws, je kunt dit niet doen in elke versie van ASP.NET tot en met ASP.NET 3.5 SP1. Ik heb ook wat goed nieuws...je zal in staat zijn om dit te doen wanneer ASP.NET 4.0 komt uit! Het magische kleine eigendom op alle ASP.NET Controls waarmee u dit kunt doen heet ViewStateMode. (Incidently, this was Dave idee en de onderstaande samples zijn een schaamteloze rip-off van hem:-))
Zet heel eenvoudig, ViewStateMode heeft 3 mogelijke waarden, Ingeschakeld, Uitgeschakeld en ErfstukWat vrij duidelijk is in hun functie...Ingeschakeld turns saving ViewState on voor die controle (of een kind controles die zijn ingesteld als "Erfgoed" of hebben niets ingesteld), Uitgeschakeld Zet het weer uit, en Erfstuk Dat is alles wat er aan de hand is.
Hier is een heel eenvoudig voorbeeld van hoe dit eigenlijk werkt:
<form id="form1" runat="server">
<script-runat= server>
protected override void OnLoad(EventArgs e) {
if (!IsPostBack) {
label1.Tekst = label2.Tekst = "[DynamicValue]";
}
basis.OnLoad(e);
}
</script>
<asp:PlaceHolder ID="PlaceHolder1" runat="server" ViewStateMode="Disabled">
Uitgeschakeld: <asp:Label ID="label1" runat="server" Text="[DeclaredValue]" /><br />
<asp:PlaceHolder ID="PlaceHolder2" runat="server" ViewStateMode="Enabled">
Ingeschakeld: <asp:Label ID="label2" runat="server" Text="[DeclaredValue]" />
</asp:PlaceHolder>
</asp:PlaceHolder>
<uur />
<asp:button ID="Button1" runat="server" Text="Postback" />
Zoals u kunt zien in deze sample zijn we het uitschakelen van ViewState voor de PlaceHolder1 controle, het kind label1 Erft deze eigenschap (zoals Inherit is standaard) en slaat daarom geen ViewStateIn PlaceHolder2 hebben we ViewStateMode ingesteld op [DynamicValue]
Het effect van dit alles is dat, wanneer de pagina voor het eerst wordt geladen, de etiketten als volgt worden weergegeven:
Uitgeschakeld: [DynamicValue]
Ingeschakeld: [DynamicValue]
Maar, doe een PostBack en zie je:
Uitgeschakeld: [DeclaredValue]
Ingeschakeld: [DynamicValue]
Zoals je nu verwacht, het eerste label heeft niet behouden de waarde die we in ViewStatehet tweede label heeft!
Wat echt cool is, is het feit dat je dit ook kunt doen:
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="WebApplication1._Standaard" WeergaveStateMode="Uitgeschakeld" %>
Vergeet niet, in WebForms pagina is gewoon een andere controle... het fungeert als de ouder controle voor elke andere controle in de pagina. Dit betekent dat geen controle zal opslaan ViewState tenzij u ViewStateMode inschakelt voor die controle of een controle verderop zijn controle hiërarchie (dus, een groot gebruik zou zijn voor ContentPlaceHolders in MasterPages...).
Ik zei toch dat het simpel was.
© 2026 Scott Galloway — Unlicense — All content and source code on this site is free to use, copy, modify, and sell.