Implementación sencilla del ControlState

El ControlState es un mecanismo alternativo al ViewState para guardar el estado de sesión en un control de usuario. Como es bien conocido disponemos múltiples objectos para guardar variables de sesión, todos ellos con una utilización parecida (básicamente son colecciones clave-valor de tipo string-object), que nos permiten mantener el estado entre llamadas en distintos ámbitos. El ámbito del controlState es pareceido al ViewState, con la diferencia fundamental de que éste último puede desactivarse. Éste es el motivo por el cual datos críticos para el buen funcionamiento del control deberían de guardarse en el ControlState (Ver Artículo MSDN) . Esta semana he constatado que su especial funcionamiento constituye una barrera de entrada para su utilización en programadores poco iniciados. Por este motivo me he decidido a publicar este post, con un pequeño código que, insertado en nuestro control, hará posible la utilización del ControlState de forma análoga al objeto Cache, ViewState, Session, etc.

    protected Dictionary<string,object> ControlState;

 

    //Guarda el diccionario personalizado y lo que

    //tuviese que guardar en el método base

    protected override object SaveControlState()

    {

        return new Pair(base.SaveControlState(), ControlState);

    }

 

    //Recupera por separado el diccionario personalizado

    //y el objeto para el método original

    protected override void LoadControlState(object savedState)

    {

        if (savedState != null)

        {

            Pair par=(Pair)savedState;

            base.LoadControlState(par.First);

            if (par.Second != null)

            {

                ControlState = (Dictionary<string, Object>)par.Second;

            }

        }

       if(ControlState==null)

           ControlState=new Dictionary<string,object>();

    }

 

Y para que todo esto funcione solo nos resta añadir en el evento load de la página la siguiente línea:

        Page.RegisterRequiresControlState(this);

 

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *