ViewState

Una de las diferencias más importantes que había hasta ahora entre la programación de un programa para PC y la programación de una Web, es que en las aplicaciones Web el cliente realiza una petición (de una página), el servidor ejectua el código asociado a la petición y le devuelve un resultado al cliente. A partir de ese momento, el servidor no tiene consciencia de cómo está actuando el cliente.

Para explicarlo mejor, veamos un sencillo ejemplo:

paginaEjemplo.aspx
<asp:TextBox ID="TextBox2" runat="server"></asp:TextBox>
<asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
<asp:Button ID="Button1" runat="server" Text="Button" OnClick="Button1_Click" />
<asp:Label ID="Label1" runat="server" Text="Label"></asp:Label>   
  

paginaEjemplo.aspx.cs
    protected void Button1_Click(object sender, EventArgs e)
    {
        Label1.Text = TextBox1.Text;
    }


En este ejemplo, cuando el cliente hace clic en el Button1, el servidor devolverá una página en la que en Label1 estará el texto que haya escrito el cliente en TextBox1... pero sucede algo más: en TextBox1 sigue estando el texto que ha escrito el cliente.

Esto, que parece tan normal y que en los programas para PC es tan típico, esconde una complejidad muy grande. Pensémoslo bien... el cliente envío los resultados de un formulario mediante el método POST, el servidor los procesa y devuelve un resultado en forma de HTML, con los controles en el mismo estado que cuando el cliente hizo el envío, en este caso con el TextBox1 rellenado...

Ese es el concepto de ViewState: el mantener el estado de los controles de una misma página entre una ida y venida al servidor. Sí, vale, estamos de acuerdo en que tampoco es que tenga demasiado mérito que el TextBox1 mantenga el valor, de hecho, eso mismo lo podríamos hacer nosotros fácilmente!!

Pero es que ViewState no se queda sólo ahí. Rellenemos, por ejemplo, tanto el TextBox1 como el TextBox2, y comprobamos que aunque al TextBox2 no se le hace alusión alguna en nuestro código, también mantiene el mismo estado... ¿sigue siendo fácil? ¡¡Pues imagínate hacer lo mismo con 20 listas desplegables, 15 cuadros de texto y todos los controles de usuario que quieras!!

Pero, ¿dónde está el truco? Como ya sabrás, lo único que no se puede hacer en programación es magia. Por ejemplo, échale un vistazo al código fuente de esta página (o cualquier otra página ASP.NET), y verás que hay un campo hidden llamado ViewState con un valor incomprensible y generalmente muy largo (depende de la página, de la cantidad de controles de los que haya que controlar el estado, etc.).

En ese valor tan extraño está almacenado el estado de todos los controles de la página (como imaginarás es una codificación de los valores legibles). Pero el ViewState no sólo es eso, el ViewState permite otras muchísimas cosas, como por ejemplo, averiguar si es la primera vez que ejecutamos una página o la hemos llamado antes ya (algo que en código se maneja con el Page.IsPostBack, del que ya escribimos un artículo).

Pero lo que más me gusta a mí es que desde código se puede acceder al ViewState y guardar las variables que quieras en él, incluso de tipos de datos que te hayas inventado tú (siempre que sean Serializables).

Por ejemplo, puedes guardar una variable en ViewState...

        ViewState["ejemplo"] = 21;

... y acceder a su valor cuando has hecho clic en tres botones y has hecho un postback con 2 listas desplegables

        int i = (int)ViewState["ejemplo"];

Sólo tienes que recordar dos cosas básicas:
1.- Hay que parsear el dato al tipo de datos que corresponde cuando leemos el valor del ViewState (en este caso al tipo integer, pero puede tratarse de cualquier tipo de datos)
2.- El ViewState es una variable del ámbito de petición una misma página. Es decir, tú puedes trabajar con el ViewState siempre que estés en la misma página y siempre que lo único que hagas en ella sean postBack. Por ejemplo, el ViewState se resetearía a su valor inicial si estando en una página presionamos el "Go" de nuestra barra de direcciones.

Si lo queremos pensar de otra forma, el ViewState es lo mismo que una variable de Session en el ámbito de una página (los puritanos me pegarán por esta definición )

Por cierto, y para acabar, si quieres que no se guarde el estado de un control, no tienes más que añadirle un atributo a éste: EnableViewState="false"