2010-05-21 15 views
37

¿Puede alguien explicar la diferencia entre ViewState y Session?ViewState Vs Session ... mantenimiento del objeto a través del ciclo de vida de la página

Más específicamente, me gustaría saber la mejor manera de mantener un objeto disponible (estableciendo continuamente miembros a través de devoluciones) a lo largo del ciclo de vida de mi página.

Actualmente uso Sesiones para hacer esto, pero no estoy seguro si es la mejor manera.

Por ejemplo:

SearchObject searchObject; 
protected void Page_Load(object sender, EventArgs e) 
{ 
    if(!IsPostBack) 
    { 
     searchObject = new SearchObject(); 
     Session["searchObject"] = searchObject; 
    } 
    else 
    { 
     searchObject = (SearchObject)Session["searchObject"]; 
    } 
} 

que me permite usar mi searchObject en otro sitio en mi página, pero es una especie de engorroso ya que tengo que reiniciar mi sesión var si cambio de propiedades, etc.

Estoy pensando que debe haber una mejor manera de hacerlo para que .NET no vuelva a crear instancias del objeto cada vez que se cargue la página, sino que también lo ubique en el ámbito global de la clase de página.

+0

Además de las respuestas a continuación, 'ViewState' requiere que los elementos almacenados sean serializables . De lo contrario, recibirás excepciones de serialización. –

Respuesta

55

Si el objeto de búsqueda no es de gran tamaño, vaya con el uso de ViewState. Un ViewState es perfecto si solo desea que el objeto viva para el ciclo de vida de la página actual.

Un objeto de sesión también es bueno de usar, pero obviamente una vez que el objeto de búsqueda está allí, estará por más tiempo el ciclo de vida de la página.

Además, una cosa que hago con objetos ViewState/sesión es envolver su acceso con una propiedad:

public object GetObject 
{ 
    get 
    { 
     return ViewState["MyObject"]; 
    } 
    set 
    { 
     ViewState["MyObject"] = value; 
    } 
} 

tiendo a encontrar más limpio que hacerlo de esta manera. Simplemente cambie el código anterior para que se ajuste a sus necesidades.

+0

Hola Jason, aunque tu dedicación para mejorar el contenido en Stack Overflow es muy apreciada, algunas personas (incluyéndome a mí) están un poco descontentas con tu reciente ola de edición de malas palabras de antiguas preguntas. Hay una discusión sobre esto aquí: [Limpiemos las publicaciones de baja calidad con profanidad en Stack Overflow] (http://meta.stackexchange.com/q/110682) Su ola de edición apareció en Meta, aunque la pregunta es sobre alguien otra persona que tuvo la misma idea hoy: [¿Qué pasa si un usuario está buscando y solo elimina palabras profanas?] (http://meta.stackexchange.com/q/165752) –

+0

Aunque no puedo evitar que realice estas ediciones , Agradecería que pudieras revisar la discusión y considerar abstenerse de * buscar * sistemáticamente para estas cosas. ¡Gracias! –

+2

Bastante justo. Simplemente no pensé que fuera apropiado tener estas palabras. No lo haré de nuevo. –

25

En primer lugar Viewstate es por página donde exista la sesión de toda la aplicación durante la sesión actual, si desea que su searchobject de persistir en varias páginas entonces la sesión es el camino correcto a seguir.

En segundo lugar Viewstate se transfiere como texto cifrado entre el navegador y el servidor con cada devolución de datos, por lo que cuanto más se almacena en Viewstate, más datos bajan y vuelven del cliente cada vez, mientras que la sesión se almacena en el lado del servidor y lo único que va hacia adelante y hacia atrás es un identificador de sesión, ya sea como una cookie o en la URL.

Si la sesión o viewstate es el lugar correcto para almacenar su objeto de búsqueda depende de lo que esté haciendo con él y de qué datos contenga, con suerte la explicación anterior le ayudará a decidir el método correcto para usar.

0

El estado de la vista es específico de la página, mientras que el estado de la sesión es específico del navegador. No puede pasar los datos de una página a otra a través del estado de visualización. Pero lo harás con el estado de la sesión. Cada sesión tiene una ID única, donde ver datos almacenados en los campos ocultos en la página. Almacena los datos en el lado del servidor, donde se visualizan los datos de estado almacenados en la página, por lo que la página se vuelve pesada y la aplicación lenta. Cada control tiene estado de vista verdadero por defecto que almacena su estado (estado de control), podemos habilitarlo o deshabilitarlo fácilmente haciendo enableviewstate = false

Cuestiones relacionadas