# ASP.NET 4.0: ViewStateMode... dando più controllo su ViewState!

<datetime class="hidden">2010-02-18T00:00</datetime>

<!-- category -- mostlylucidcouk, Imported -->
VisualizzaState è un dolore... là, l'ho detto! Ciò che causa più dolore con ViewState è il fatto che le persone abusano molto, lasciandolo abilitato per ogni controllo in una pagina quando in realtà è solo davvero bisogno di esso per quel controllo che ha davvero bisogno di perseverare nei contenuti della pagina successiva. [Dave Reed](http://weblogs.asp.net/infinitiesloop/) uno sviluppatore sul team ASP.NET ha scritto un post davvero epico su [Visualizza lo Stato in base alla verità](http://weblogs.asp.net/infinitiesloop/archive/2006/08/03/Truly-Understanding-Viewstate.aspx), e prima di leggere quello che viene dopo, dovresti davvero andare via e leggere prima

Indietro?

Ok, bene ora si capisce che si dovrebbe utilizzare VisualizzaState solo per quei controlli che effettivamente ne hanno bisogno. Ma c'è un problema ... quello che si è veramente piace fare è disattivare ViewState per un'intera pagina poi solo accenderlo di nuovo per **i controlli che ne hanno bisogno,** Spiacente, ma ho alcune cattive notizie, è possibile farlo in qualsiasi versione di ASP.NET fino a e compreso ASP.NET 3.5 SP1. Ho anche alcune buone notizie ... sarete in grado di farlo quando ASP.NET 4.0 esce! La piccola proprietà magica su tutti i controlli ASP.NET che consente di fare questo si chiama ViewStateMode. (Incidentalmente, questo era [Dave solani n.c.a.](http://weblogs.asp.net/infinitiesloop/) idea e i campioni qui sotto sono uno spudorato strappo da lui :-))

Detto molto semplicemente, ViewStateMode ha 3 valori possibili, **Abilitato**, **Disabilitato** e **Ereditario**Che sono piuttosto evidenti nella loro funzione...**Abilitato** attiva il salvataggio di VisualizzaState per tale controllo (o qualsiasi controllo figlio che sia impostato come "Inherit" o che non abbia nulla impostato), **Disabilitato** spegnerlo di nuovo, e **Ereditario** dice di usare tutto ciò che il mio genitore è impostato su di esso. Questo è davvero tutto ciò che c'è ad esso!

Qui si tratta di un campione molto semplice di come questo funziona effettivamente:

&lt;form id="form1" runat="server"&gt;

&lt;script runat=Server=Server=Script runat=Script runat&gt;

override vuoto protetto OnLoad(EventArgs e) {

if (!IsPostBack) {

label1.Text = label2.Text = "[DynamicValue]";

}

base.OnLoad(e);

}

&lt;/script&gt;

&lt;asp:PlaceHolder ID="PlaceHolder1" runat="server" ViewStateMode="Disabled"&gt;

Disabilitato: &lt;asp:Label ID="label1" runat="server" Text="[Valore dichiarato]" /&gt;&lt;br /&gt;

&lt;asp:PlaceHolder ID="PlaceHolder2" runat="server" ViewStateMode="Enabled"&gt;

Abilitato: &lt;asp:Label ID="label2" runat="server" Text="[Valore dichiarato]" /&gt;

&lt;/asp:PlaceHolder&gt;

&lt;/asp:PlaceHolder&gt;

&lt;ora /&gt;

&lt;asp:button ID="Button1" runat="server" Text="Postback" /&gt;

Come puoi vedere in questo esempio noi disattiviamo VisualizzaState per il controllo di PlaceHolder1, l'etichetta figlio1 eredita questa proprietà (come è predefinita Inherit) e quindi non salva VisualizzaStatutoIn PlaceHolder2 selezioniamo VisualizzaStatutoModalità a &lt;Enabled &gt;, che porta ad etichetta2 ereditando questa proprietà e quindi salva VisualizzaStatutoSulla prima pagina di carico selezioniamo entrambe le etichette per l'output del testo [DynamicValue]

L'effetto di tutto questo è che, quando la pagina carica per la prima volta si vedono le etichette rese come segue:

Disabilitato: [DynamicValue]

Abilitato: [DynamicValue]

Ma, fare un PostBack e si vede:

Disabilitato: [Valore dichiarato]

Abilitato: [DynamicValue]

Come vi aspettavate, la prima etichetta hasn hasn ha preservato il valore che abbiamo impostato in ViewState la seconda etichetta ha!

Ciò che è veramente cool è il fatto che si può anche fare questo:

&lt;%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="WebApplication1.\_Predefinito" VisualizzaStateMode="Disabilitato" %&gt;

Ricorda, in WebForms Page è solo un altro controllo ... agisce come il controllo genitore per ogni altro controllo nella pagina. Ciò significa che nessun controllo salverà ViewState **a meno che non si imposta ViewStateMode ad Abilitato** per quel controllo o un controllo più in alto la gerarchia di controllo (quindi, un grande uso sarebbe per ContentPlaceHolders in MasterPages ...).

Te l'avevo detto che era semplice!