Vindt u het ook zo vervelend dat de waardes die u in een formulier heeft ingevuld verdwenen zijn als u iets verkeerd heeft ingevoerd? Met server controls behoort dit probleem tot het verleden. Server controls bewaren al hun waardes en opmaak wanneer een postback plaatsvindt. Als de pagina uitgevoerd wordt zet ASP.NET de waardes en opmaak terug, zodat de pagina hetzelfde is als voor de postback. Dit kan natuurlijk niet zomaar, ASP.NET moet de waardes en de opmaak ergens vandaan halen. Helaas worden alleen de waardes in formuliervelden door een webbrowser naar de server gestuurd bij een postback. Daarom werkt ASP.NET met een mechansime dat de ViewState wordt genoemd. Hierin worden de waardes en de opmaak van alle controls bewaard (tenzij anders aangegeven). Als de server dit allemaal op de server zou bewaren, bijvoorbeeld in het geheugen, dan zou de server snel vol lopen. Stel je voor dat er 1000 gebruikers tegelijk de website bezoeken. Dan zouden er duizenden pagina's in het geheugen zitten, omdat we niet kunnen aannemen dat een gebruiker altijd dezelfde pagina opvraagt. En hoe lang zou gewacht moeten worden met het vrijmaken van het geheugen? Als een gebruiker 10 minuten geen pagina heeft opgevraagd? Maar wat dan als de gebruiker even koffie is gaan zetten? Als de 10 minuten verstreken zijn, zou de pagina niet meer werken. Dat is natuurlijk zeer onwenselijk, dus slaat ASP.NET deze gegevens ergens anders op namelijk in de pagina zelf. U kunt dit zien aan de hand van het onderstaande voorbeeld (hoewel een willekeurige pagina met server controls het ook demonstreert).
<html> <head> </head> <body> <form runat="server"> <p> Email: <asp:TextBox id="TextBox1" runat="server"></asp:TextBox> </p> <p> <asp:CheckBox id="CheckBox1" runat="server" Text="Nieuwsbrief ontvangen"></asp:CheckBox> </p> <p> <asp:Button id="Button1" runat="server" Text="Inschrijven"></asp:Button> </p> </form> </body> </html>
Als u de bovenstaande pagina opvraagt, blijven de waardes in de TextBox controls hetzelfde, en nadat u de opmaak van de Label control heeft aangepast, blijft ook die nieuwe opmaak actief na volgende postbacks. Als u nu in de webbrowser de HTML bron weergeeft, ziet u ten eerste dat ASP.NET alle server controls omgezet heeft in normale HTML. Verder ziet u een verborgen formulierveld met de naam __VIEWSTATE, zoals hieronder. Dit is het veld waar de ViewState voor alle controls bewaard wordt. Iedere keer dat er een postback plaatsvindt, wordt ook dit veld meegestuurd, en kan ASP.NET dus bepalen hoe de server controls eruit zagen voor de postback.
<html> <head> </head> <body> <form name="_ctl0" method="post" action="viewstate.aspx" id="_ctl0"> <input type="hidden" name="__VIEWSTATE" value="dDwyOTY2Mjk2ODM7O2w8Q2hlY2tCb3gxOz4+/kiU/3Jv8d/1MX4oPfDMGVcchBc=" ID="Hidden1"/> <p> Email: <input name="TextBox1" type="text" id="TextBox1" /> </p> <p> <input id="CheckBox1" type="checkbox" name="CheckBox1" /> <label for="CheckBox1">Nieuwsbrief ontvangen</label> </p> <p> <input type="submit" name="Button1" value="Inschrijven" id="Button1" /> </p> </form> </body> </html>
Omdat de ViewState gewoon in de pagina staat, blijft deze bruikbaar zolang de gebruiker de pagina open heeft in de webbrowser. Dus zelfs als u zou besluiten morgen verder te gaan met waar u mee bezig was, is de ViewState nog steeds bruikbaar.
Een nadeel van de ViewState is dat deze naarmate er meer server controls op een pagina staan, de ViewState groter wordt. Met complexe server controls, bijvoorbeeld die gegevens uit een database weergeven, kan dit zelfs behoorlijk oplopen. Een ViewState van 100 kB is dan al snel bereikt. U kunt daarom de ViewState uitzetten voor pagina's of server controls waarvoor de ViewState niet nodig is. Dit betekent wel dat de pagina of de server controls waarvoor dit geldt weer terug naar hun beginstand gaan als er een postback plaatsvindt, maar dit is niet altijd een probleem, zeker niet voor pagina's die alleen wat informatie weergeven, en waar de gebruiker verder niets mee kan doen. Als u de ViewState uit wilt zetten voor een hele pagina, dan kunt u dit doen door EnableViewState="False" toe te voegen aan de pagina declaratie, zoals in het onderstaande voorbeeld:
<%@ Page Language="VB" EnableViewState="False"%>
U kunt de ViewState ook per server control uitzetten door EnableViewState="False" toe te voegen aan de server control(s) waarvoor u dit wilt doen.
Omdat de ViewState in de pagina meegestuurd wordt, bestaat het risico dat iemand deze kan manipuleren, en daardoor problemen kan veroorzaken. Voor de meeste pagina's is dit totaal geen probleem, omdat de daarmee alleen de opmaak en de waardes worden aangepast. Heeft u een pagina waarvoor u voorziet dat het probleem groter is, dan kunt u de ViewState laten controleren voordat deze gebruikt wordt. Deze controle, die standaard uit staat, heet een Machine Authentication Check (MAC), oftewel Machine Identificatie Controle. De MAC wordt uitgevoerd als u EnableViewStateMac="True" in de paginadeclaratie zet, als volgt:
<%@ Page Language="VB" EnableViewStateMac="True"%>
⌐2002 Microsoft Nederland BV