A parte un discreto insieme di novità per AJAX, non è che ASP.NET 4.0 offra poi granché. Chi si illudeva di trovarci magari una schema di implementazione per MVP è per ora rimasto deluso. La parola d'ordine sembra essere "più controllo". E in effetti se escludiamo rivoluzioni filosofiche non è che sia rimasto molto da sistemare. Quindi o ci sta bene com'è o ci si rivolge a ASP.NET MVC.

Una cosa effettivamente sistemata per il meglio (oddio, a parte la confusione tra proprietà un pochino sovrapposte) riguarda il viewstate.

Non starò qui a menarla (ancora) sul fatto che il viewstate non è un modo perverso di appesantire le pagine. Che ci crediate o no, il viewstate serve a qualcosa e lasciarlo nella pagina è la soluzione con meno controindicazioni.  Detto che il viewstate di fatto serve realmente solo per pochissimi controlli in una pagina, fino ad ASP.NET 3.5 SP1 si scopre che in effetti opt-out è il solo approccio supportato. Tradotto, che vuol dire?

Il viewstate è controllato dalla proprietà booleana EnableViewState. E uno pensa che gli basta disabilitarlo sul controllo che vuole e tutto va a meraviglia. Sbagliato. Se il viewstate è abilitato sulla pagina (in generale sul container di un controllo) ogni controllo  figlio ne eredita il valore. Punto. E soprattutto indipendentemente dal valore di EnableViewState sul controllo stesso.

Ora in ASP.NET 4.0 potevano semplicemente invertire la logica nel setter di EnableViewState. Ma questo probabilmente avrebbe causato casini con le miriadi di applicazioni esistenti. Ergo, appare dal nulla una nuova proprietà: ViewStateMode. La proprietà può assumere tre valori (Disabled-Enabled-Inherit) ovviamente riferiti allo stato del viewstate sul controllo. Grazie a questa proprietà, il supporto per il viewstate in ogni controllo diventa opt-in ovvero ciascun controllo decide se vuole il viewstate o no. Soprattutto può farlo indipendentemente da ci; che fa il parent.

Tutto facile? Manco per sogno

Per un vero scenario opt-in seguire le istruzioni:

  • EnableViewState per la pagina/container deve essere sempre true
  • ViewStateMode per la pagina/container va messo a Disabled
  • ViewStateMode per i controlli che si vuole va messo a Enabled

Al momento altre combinazioni o non funzionano o non danno risultati predicibii.