Chalalo Land

Tecnologías ASP.NET y un poco Más

Contacto


 Si quierer cooperar, yo feliz, muy agradecido :)

De donde me Visitan?

Locations of visitors to this page

Generic Content

Si te gustaron los articulos, y te animas te estaría muy agradecido!


Recent Posts

Tags

Community

Blogs de MVP

Amigos Geeks

Blogs Imperdibles

GODS

Archives

Email Notifications

ASP.NET 4.0 - Mejorando el Rendimiento con ViewStateMode

Basado en el artículo:
http://geekswithblogs.net/ranganh/archive/2009/08/14/whatrsquos-new-in-asp.net-4.0.aspx

Todos sabemos que el tema  del ViewState nos puede causar problemas de rendimiento en nuestras aplicaciones, cuando crece debido a que existe una gran cantidad de webcontrols anidados en nuestra página, si bien podemos setear la propiedad EnableViewstate en False, con lo cual no se mantendrá el estado de este control entre Postback, existe la complicación que si el control contendedor, por ejemplo un panel, tiene la propiedad EnableViewstate en True, los controles contenidos, aunque su propiedad EnableViewState esté en False, de todas maneras se mantendrá el estado en el ViewState , es decir, existe una herencia del valor de la propiedad, lo que resulta incoherente y muchas veces los esfuerzos por disminuir el ViewState , nulos.

Ahora, bien, ASP.NET 4.0 viene con la nueva propiedad ViewStateMode, que en resumen, nos ayuda a determinar eficazmente para cada control si el ViewState va a estar habilitado, deshabilitado, o heredado.

La propiedad ViewStateMode nos va a permitir habilitar el ViewState para un control individual incluso si a nivel de página, el ViewState está deshabilitado.

Para desactivar el ViewState de una página y activarlo para un control específico, deberíamos es setear la propiedad  EnableViewState de la página y el control en true, luego setear la propiedad ViewStateMode de la página como Disabled y setear la propiedad ViewStateMode del control como habilitado.

La propiedad ViewStateMode de una página o de un control tiene efecto siempre y cuando se establece la propiedad EnableViewState en true.

Los posibles valores del ViewStateMode son:

Inherit Hereda el valor del ViewStateMode desde el control Padre (contenedor)
Enabled

Habilita el ViewState para el control incluso si el control padre tiene el estado ViewStateMode deshabilitado  (El control Padre debe tener el ViewState habilitado)

Disabled Deshabilita el ViewState para este control, incluso si el control padre tiene el ViewState Activado (Independiente si tiene el ViewStateMode Habilitado o Deshabilitado)

Veamos un ejemplo para cada uno de los estados que anteriormente vimos, tomemos el siguiente escenario:

<asp:Panel BackColor="Aqua" ID="panel1" runat="server" ViewStateMode="Enabled">

Desabilitado: <asp:Label ID="label1" runat="server"  Text="Valor seteado declarativamente"  ViewStateMode="Disabled"  />
<
br /> 
Habilitado: 
<asp:Label ID="label2"  runat="server" Text="Valor seteado declarativamente" ViewStateMode="Enabled" /> 
<hr /> 
  <asp:button ID="Button1" runat="server"  Text="Generar Postback" />

</asp:Panel>

Lo que nos deja, en la vista diseño:

image

y en el código programático:

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
If Not Page.IsPostBack Then
  panel1.BackColor = Drawing.Color.LightGray
  label1.Text = "Valor establecido por código programático"
  label2.Text = "Valor establecido por código programático"
End If
End Sub

Según lo anterior, en la primera carga de página (cuando no es un postback) se va a ejecutar el código que está dentro del la condición del Page_Load.

image

Ahora, cuando generamos el Postback, veremos lo siguiente:

image

Como vemos, ocurrió postback , ya no entramos en la condición del Page_load, mediante el contenido del ViewState se mantuvo el estado del panel (color Gris), y el valor del segundo label (habilitado), que es el label con la propiedad ViewStateMode="Enabled" , en tanto ViewStateMode="Disabled" no tiene información en su ViewState, no mantiene el estado y por consiguiente se setea con lo que se estableció en el código declarativo.

De este modo si reviso el viewstate, vemos que pesa aproximadamente 184 bytes.

image

A continuación vamos a setear la propiedad del panel1 ViewStateMode="Disabled", que corresponde al contenedor de los labels. El resultado :

image

Al igual que la anterior prueba, tampoco el panel mantiene el estado por lo que se setea la propiedad con lo seteado en el código declarativo, pero sin embargo, label2, posee su mantención de estado. Por otro lado, si revisamos el tamaño del ViewState generado vemos que pesa aproximadamente 153 bytes.

image

Si bien, esto es un ejemplo sencillo, podemos proyectar esta funcionalidad para páginas con muchos webcontrols anidados, permitiendo, de esta manera, disminuir el tamaño del viewstate, seleccionando eficazmente, los controles que si queremos que mantengan su estado.

Espero que te haya servido!
Nos vemos,
Gonzalo

Posted: 28/8/2009 18:53 por Gonzalo Perez | con 6 comment(s) |
Archivado en: ,,
Comparte este post:

Comentarios

Jesús Bosch ha opinado:

Interesante esta nueva funcionalidad. En algunas ocasiones, si la aplicación no tiene muchos usuarios concurrentes, puede ser interesante almacenar el viewstate en el servidor (en un objeto de sesión) y no en el cliente, así evitamos transmisión de datos.

# August 29, 2009 1:08 AM

El Bruno ha opinado:

che que bueno esto ... lo anoto para la lista de novedades (aun no siendo fan de las web apps)

Saludos

# August 30, 2009 12:15 AM

Fernando Gómez ha opinado:

La solución de Jesus es buena, pero con el manejo de session hay que tener cuidado, ya que lo que metamos alli dura durante toda la session, y somonos nosotros los encargados de limpiarla, para no sobrecargarla o tener objetos inservibles.

Por eso lo bueno de esta nueva propiedad, que nos permite mejorar el rendimiento de nuestra aplicacion con el viewstate y seguir usando la session para cuando es necesario.

un saludo

# May 29, 2010 10:50 AM

Gonzalo Perez ha opinado:

Gracias por el comentario Fernando :)

# May 29, 2010 10:52 PM

Pablo Alvarez ha opinado:

Como dice Fernando, ¡mucho cuidadito con los ViewStates en Sesion! yo ahora estoy ayudando a un cliente con el rendimieto de su aplicación web que tiene variables de sesión de más de 50Mb por culpa de ViewStates másivos, historicidad de los mismos (ViewsStateHistory) y unos UpdatePanels que abarcan toda la pagina... vamos, que lo tienen todo los pobres :)

Ojala pudieramos movernos a ASP.NET 4 en este escenario, el ViewStateMode que nos comenta Gonzalo nos vendría de perlas para los UpdatePanels!!

Gracias por el post!

# May 31, 2010 12:10 PM

Gonzalo Perez ha opinado:

Hola Pablo, buenísimo lo que estas haciendo, de hecho derrepente hay criticas a ASP.NET por temas de rendimiento, y es en realidad que algunos caen en malas prácticas  (como UpdatePanels abarcando absolutamente toda la página), el tema es ser cuidadoso y pensar en el rendimiento a atraves de todo el proceso de construcción del WebSite.

Sería muy bueno que pudieses compartir esos tips de optimización :)

Un abrazo!

# May 31, 2010 3:58 PM