Variables globales en un sitio ASP.NET

Me encuentro ahora mismo desarrollando un sitio web en ASP.NET  para una asignatura de la universidad y esta tarde me he encontrado con que necesito tener accesibles algunos datos en cualquiera de las páginas que componen el sitio web, así que voy a dejar aquí las dos formas de hacer esto que he encontrado.

Para poneros en situación os diré que mi sitio web está compuesto por una MasterPage, varias páginas de contenido asociadas a la MasterPage y dos páginas más que no están asociadas; la MasterPage tiene un control de LoginName del cual quiero obtener el nombre del usuario que está logueado en cada momento en cualquier página.

Aclaración: podemos obtener el nombre de usuario logueado en el site mediante «this.User.Identity.Name», que sería mucho más correcto para obtener el nombre del usuario en cualquier momento. Sin embargo la idea es ejemplificar como llevar un dato de una parte a otra del site en situaciones en las que no dispongamos del tipo de facilidades como la que tenemos en el caso concreto que he utilizado de ejemplo en el post.

En el Web.config

Para hacer esto he visto varias maneras, la primera de todas se trata de guardar los datos en el Web.config en la zona de «appSettings», esto lo haría de la siguiente forma:

Primero añadiendo una clave a la zona de appSettings en el Web.config

<appSettings>  

        <add key=»username» value=»valor» />

</appSettings>

Y luego en el código de la página en la que lo necesitemos podemos obtener o modificar el valor de la clave mediante:

System.Configuration.ConfigurationSettings.AppSettings[«username»] 

En el Global.asax

Otra manera que he visto es utilizando el archivo Global.asax. Este archivo opcional en los desarrollos de ASP.NET nos permite manejar eventos que ocurren a nivel de la aplicación y de sesión, también nos permite declarar valores que necesitemos entre las diferentes solicitudes.

El archivo Global.asax para que funcione tiene que permanecer en la raíz de la aplicación y solo se admite uno por aplicación ejecutada. Si tenemos algún otro archivo de este tipo en algún subdirectorio no se tendrán en cuenta por la aplicación.

Cuando declaremos una variable dentro de Global.asax estará disponible en todas las páginas de la aplicación. Lo podemos hacer de la siguiente manera:

En el fichero Global.asax declaramos una variable string y luego en Session_Start otorgamos el valor de la cadena a un objeto de tipo Session que en mi caso se llama valorCadena.

public class Global : System.Web.HttpApplication
    {
        string cadena=»valor inicial»;
        protected void Application_Start(object sender, EventArgs e) { }
        protected void Session_Start(object sender, EventArgs e)
        {
            Session[«valorCadena»] = cadena;
        }

          ……

Luego en la página que lo necesitemos podemos escribir valores:

       Session[«valorCadena»] = «la_cadena_que_quiera_poner»;

y leer de la variable:

       Label1.Text = (string)Session[«valorCadena»];

Aporte: Jorge Dieguez nos hace un comentario interesante: «..te recomiendo que en lugar de una(o varias) varaibles sueltas uses una clase que te centralize el acceso a la infromacion de contexto(usuario,su perfil, o lo que sea), esta clase es la responable de almacenear el estado en algun lugar(por ejemplo en la sesion) la idea es que la aplicacion no sepa como y donde se guarda la informacion de contexto..». Quizás es la solución más elegante de todas las planteadas.

Pues nada, si hay alguna corrección o manera más de hacer esto ponedlo en los comentarios y así vamos completando entre todos el post

P.D.: Si queréis más información sobre Global.asax podéis leer algo más aquí

Saludetes 🙂