2012-10-11 31 views
5

Estaba leyendo este artículo de Microsoft sobre la administración del estado.Almacenamiento de datatable en ViewState

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

He encontrado algo interesante aquí. ViewState se clasifica como opción del lado del cliente (aunque ya lo sabía). Me recuerda nuestro código en la aplicación.

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

Y este código funciona bien en este momento.

Mi confusión es:

  1. ¿Cómo puede un objeto lado del cliente (ViewState) guardar objetos del lado del servidor (Datatable)?
  2. ¿Es una buena práctica usar ViewState para almacenar objetos grandes como Datatables?
  3. ¿Cuál podría ser posiblemente el efecto secundario (si existe) si seguimos usando este enfoque?
+5

Downvoters: si no deja comentarios, el OP nunca aprenderá cómo hacer mejores preguntas. Personalmente, no veo ningún problema con esta pregunta. Creo que es útil para la comunidad, así que estoy agregando un +1 para equilibrar las cosas. – JDB

+1

@ Cyborgx37 World es un lugar mejor para vivir gracias a personas como usted. Soy bastante nuevo en esta tecnología y estoy tratando de aprender y eliminar mis confusiones. Es por eso que estoy haciendo preguntas como estas. Pero algunos Downvoters piensan que todos saben lo que conocen y nadie debería hacer esas preguntas. Me recuerda un proverbio chino "El que hace una pregunta es un tonto durante cinco minutos, el que no hace una pregunta permanece inservible para siempre". Lolz –

+0

Gracias, pero en realidad hay un estándar para juzgar las preguntas buenas/malas, lo que significa que no todas las preguntas sobre StackOverflow son bienvenidas (ver http://stackoverflow.com/questions/how-to-ask). Simplemente no veo un problema con el tuyo. – JDB

Respuesta

8

viewstate se almacena en una etiqueta oculta <input /> en el formulario. Cuando el usuario inicia una devolución de datos (haciendo clic en un botón, por ejemplo), los datos se devuelven al servidor como parte de los datos del formulario.

Si almacena grandes cantidades de datos en ViewState, incurrirá en una penalización tanto cuando el usuario intente descargar la página (porque todos esos datos serán parte del HTML) como cuando el usuario intente enviar el formulario (porque todos los datos deben cargarse nuevamente en el servidor).

Además, el ViewState se pierde fácilmente. Solo se conserva mientras el usuario envíe el formulario. Si el usuario hace clic en un hipervínculo a otra página, nunca se envía el formulario y se pierden todos los datos contenidos en ViewState. Esto es cierto incluso si la etiqueta de anclaje apunta a la página en la que el usuario se encuentra actualmente.

Veo en su previous question que está tratando de encontrar un buen lugar para colocar sus DataTables. ViewState no es el peor lugar siempre que los datos sean relativamente pequeños. Base64 es mejor que XML en términos de uso de memoria, pero todavía está lejos de ser eficiente. Si los datos son bastante estáticos, le recomendamos que los guarde en el ApplicationState. Si está editando la DataTable con un GridView, entonces GridView ya está almacenando la DataTable para usted, a la que puede acceder a través de la propiedad DataSource (simplemente transfiérala a una DataTable).


También vale la pena señalar que mientras que los datos ViewState está codificado en base64 (lo que significa que el usuario medio no será capaz de entenderlo), que puede ser editado fácilmente por un usuario determinado. Los datos aparentemente inofensivos podrían ser editados para volverse bastante dañinos para su sitio web. Esta es una avenida clásica para hackear un sitio web, por lo que debe tener mucho cuidado con los datos, exactamente, que está almacenando. Por ejemplo, si almacena la identificación del usuario en ViewState, el usuario podría editar la identificación y piratear la cuenta de otro usuario. (Nota: esto es sólo un problema si EnableViewStateMac se ha establecido en False.)

+1

Nota al margen: se serializa en el valor de entrada y se deserializa en el camino de regreso. –

+0

@ Cyborgx37, ¿Habilitará la ayuda de ViewStateMAC en el caso de editar ViewState? –

+1

Sí, 'EnableViewStateMac' contribuirá en gran medida a prevenir el pirateo de ViewState. – JDB

4

1) ¿Cómo puede un objeto lado del cliente (ViewState) guardar objetos del lado del servidor (Datatable)?

Se serializa.

2) ¿Es una buena práctica usar ViewState para almacenar objetos grandes como Datatables?

Depende de su entorno y sus requisitos.

3) ¿Cuál podría ser posiblemente el efecto secundario (si corresponde) si seguimos usando este enfoque?

Muchos datos pasarán por el cable. Podría desacelerar las cosas.

+3

Otra nota al margen: Serializar un objeto grande también hará que se ralentice ... no solo la transferencia de cable. –