Le eccezioni non "si verificano" di volta in volta. Si verificano sempre per motivi validi, alcuni dei quali sono già elencati nelle altre risposte.
Tuttavia, per alleviare i problemi con ViewState prendere in considerazione la disabilitazione del tutto. Come sviluppatori ASP.NET, spesso tendiamo a utilizzare ViewState in tutti i tipi di posizioni in cui non è necessario perché è l'impostazione predefinita.Di solito penso di usare l'html statico prima di prendere in considerazione l'utilizzo di un controllo. Se decidi di utilizzare un controllo, pensa se è necessario che ViewState sia abilitato. Disabilitarlo porta spesso a tempi di caricamento delle pagine migliori, quindi se puoi, fallo.
Vorrei che fosse disabilitato di default così le persone sono state costrette a pensare in questo modo, ma non lo è.
Update per rispondere a un commento:
della parte superiore della mia testa io vengo con 3 possibilità di spegnere ViewState.
Disabilitare ViewState se i dati vengono caricati su ogni postback. Questo sarà spesso il caso se stai costruendo siti abilitati AJAX (ovvero reale AJAX non quel tipo UpdatePanel;)), dove di solito carichi i dati sul primo carico e poi ricarichi/aggiorni i dati usando le richieste AJAX. In alcuni casi è possibile caricare i dati su ogni visita al solo scopo di disabilitare ViewState e quindi memorizzare i dati sul server.
Si può anche considerare di disabilitare ViewState se si associa al contenuto statico. A volte trovo una lista che è data da una piccola tabella statica basata sul database o qualcosa del genere. Ora, questo può essere pericoloso, ma se sono convinto che i dati non cambieranno, potrei spostare i dati nella pagina come contenuto statico (potresti avvolgerlo in un controllo separato in modo da non avere più copie statiche dei dati). Ma se i dati poi cambiano, dovrai cambiarli manualmente.
Controlli semplici come Etichette sono spesso buoni candidati per disabilitare ViewState.
Infine si potrebbe passare a framework ASP.NET MVC e dire addio per sempre a questi problemi, che è quello che ho intenzione di fare anche se dovrò affrontare alcuni altri problemi. ;)
Puoi dare maggiori dettagli su punto 2? –
Well viewstate contiene una firma per proteggersi da qualcuno che lo modifica sul lato client. Quella firma è generata dalla chiave della macchina per il server. A meno che non si imposti un codice macchina specifico, esso viene rigenerato al riavvio del pool di applicazioni, rendendo tutti i precedenti viewstate non validi. Se si dispone dell'autenticazione utente, è necessario impostare anche ViewStateUserKey per proteggersi da CSRF. – blowdart