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:
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.
Ahora, cuando generamos el Postback, veremos lo siguiente:
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.
A continuación vamos a setear la propiedad del panel1 ViewStateMode="Disabled", que corresponde al contenedor de los labels. El resultado :
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.
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