2012-10-11 6 views
5

Stavo leggendo questo articolo di Microsoft sulla gestione dello stato.Memorizzazione datatable in ViewState

http://msdn.microsoft.com/en-us/library/75x4ha6s(v=vs.100).aspx

ho trovato una cosa interessante qui. ViewState è categorizzato come opzione lato client (anche se già lo sapevo). Mi ricorda il nostro codice nell'applicazione.

DataTable dt = getDatatableFromDB(); 
ViewState["dataTable"] = dt; 

E questo codice funziona correttamente al momento.

La mia confusione è:

  1. Come può un oggetto lato client (ViewState) salva oggetto lato server (Datatable)?
  2. È consigliabile utilizzare ViewState per archiviare oggetti di grandi dimensioni come i Datatables?
  3. Quale potrebbe essere l'effetto collaterale (se esiste) se continuiamo a utilizzare questo approccio?
+5

Downvoters: se non si lasciano commenti, l'OP non imparerà mai come fare domande migliori. Personalmente, non vedo alcun problema con questa domanda. Credo che sia utile per la comunità, quindi aggiungo un +1 per bilanciare le cose. – JDB

+1

@ Cyborgx37 Il mondo è un posto migliore in cui vivere per persone come te. Sono abbastanza nuovo a questa tecnologia e sto cercando di imparare e rimuovere le mie confusioni. Ecco perché sto facendo domande come queste. Ma alcuni Downvoters pensano che ciò che è noto a loro sia noto a tutti e nessuno dovrebbe porre questa domanda. Mi ricorda un proverbio cinese "Colui che fa una domanda è un pazzo per cinque minuti chi non fa una domanda rimane un pazzo per sempre". Lolz –

+0

Grazie, ma in realtà esiste uno standard in base al quale valutare le domande buone/cattive, ovvero non tutte le domande su StackOverflow sono benvenute (consultare http://stackoverflow.com/questions/how-to-ask). Solo non vedo un problema con il tuo. – JDB

risposta

8

Il viewstate è memorizzato in un tag nascosto <input /> nel modulo. Quando l'utente avvia un postback (facendo clic su un pulsante, ad esempio), i dati vengono restituiti al server come parte dei dati del modulo.

Se si memorizzano grandi quantità di dati nel ViewState, si incorrere in una sanzione sia quando l'utente tenta di scaricare la pagina (in quanto tutti i dati sarà parte del HTML) e quando l'utente tenta di inviare il modulo (perché tutti questi dati devono essere caricati di nuovo sul server).

Inoltre, il ViewState si perde facilmente. Viene conservato solo finché l'utente invia il modulo. Se l'utente fa clic su un collegamento ipertestuale a un'altra pagina, il modulo non viene mai inviato e tutti i dati contenuti in ViewState vengono persi. Questo è vero anche se il tag di ancoraggio punta alla pagina in cui l'utente è attualmente attivo.

Vedo dal tuo previous question che stai cercando di trovare un buon posto dove mettere i tuoi DataTable. ViewState non è il posto peggiore fintanto che i dati sono relativamente piccoli. Base64 è migliore di XML in termini di utilizzo della memoria, ma è ancora molto lontano dall'efficienza. Se i dati sono abbastanza statici, potrebbe essere utile archiviarli nello ApplicationState. Se stai modificando DataTable con GridView, GridView sta già memorizzando per te il DataTable a cui puoi accedere tramite la proprietà DataSource (è sufficiente ricollocare su DataTable).


È anche interessante notare che mentre i dati ViewState è codificato in base64 (che significa che l'utente medio non sarà in grado di capire), può essere facilmente modificato da un utente determinato. Dati apparentemente innocui potrebbero essere modificati per diventare piuttosto dannosi per il tuo sito web. Questa è una strada classica per l'hacking di un sito Web, quindi devi stare molto attento a quali dati, esattamente, stai memorizzando. Ad esempio, se si memorizza l'ID dell'utente nel ViewState, l'utente può modificare l'ID e hackerare l'account di un altro utente. (Nota: questo è solo un problema se EnableViewStateMac è stato impostato su False.)

+1

Nota a margine: viene serializzato nel valore di input e deserializzato al suo ritorno. –

+0

@ Cyborgx37, abiliterà l'aiuto di ViewStateMAC in caso di modifica di ViewState? –

+1

Sì, 'EnableViewStateMac' contribuirà notevolmente a prevenire l'hacking di ViewState. – JDB

4

1) Come può un oggetto lato client (ViewState) salva oggetto lato server (Datatable)?

È serializzato.

2) È consigliabile utilizzare ViewState per archiviare oggetti di grandi dimensioni come i Datatables?

Dipende dal vostro ambiente e requisiti.

3) Quale potrebbe essere l'effetto collaterale (se esiste) se continuiamo a utilizzare questo approccio?

Un sacco di dati andranno sul filo. Potrebbe rallentare le cose.

+3

Un'altra nota a margine: la serializzazione di un oggetto di grandi dimensioni causerà anche un rallentamento .. non solo il trasferimento via cavo. –