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 🙂

6 thoughts on “Variables globales en un sitio ASP.NET

  1. para el caso de saber el nombre del usuario logueado puedes usar la propiedad user que viene por default en todas las pagina, ahi tienes acceso a la propiedad identity y a algunas funciones de utilidad como por ejemplo el acceso al rol(es) del usuario logueado, ejemplo:

    this.User.Identity.Name

    salu2

  2. Hola Edel!!

    Muchas gracias por el comentario.
    Efectivamente para el caso particular de obtener el nombre del usuario en cualquiera de las páginas deberíamos usar la propiedad que nos indicas.

    Sin embargo aunque en este caso hago uso de un componente en el que tengo una propiedad en la que obtengo fácilmente lo que planteo, va más enfocado a situaciones menos especificas como por ejemplo usar un contador o hacer algún tipo de cálculo en la página principal y poder disponer de ese valor en resto del site.

    Aún así voy a indicarlo en el post para que no lleve a confusión.

    Muchas gracias!!

    Saludetes

  3. Hola, 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. no se si me he explicado:-)

  4. Hola.

    Hay otras estrategias que se pueden utilizar, la de la clase me parece buena pero para accesar los datos mas facil podrias crear una clase base que herede de la clase Page y hacer que tus paginas hereden de esta nueva clase y exponer las propidades de forma mas facil.

    Recuerde que tambien existe el objeto HttpContext.Application que se comporta como una variable de Session pero su contexto es la aplicación por lo tanto es muy util para no duplicar información entre sessiones; es decir si hay datos que sirven para todoslos usuarios no ponerlos en el objeto session.

    y por ultimo y tal vez mas importante de todos es el objeto Cache es lo mejor para persistir datos y no olviden combinarlo con SQLCahceDependency.

    Saludos!!!!!!!!!!

  5. Muy Buenas noches compañeros quizas es parte de mi ignorancia la verdad me he cansado de buscar y no he conseguido la solucion a mi problema… les comento rapidamente intento almacenar unas variables para toda mi aplicacion pero deseo hacerlo en un lugar centralizado he leido en varios tutoriales los beneficios que me trae usar el archivo global.asax… y lo he querido realizar aca…

    pues bien… he querido emplear el metodo Session_Start y en realidad no me funciona lo que estoy deseando. y lo unico que quiero es que en el formulario me ubique los valores que deseo aca: colocare el codigo de los 3 archivos para que vean si me pueden ayudar por favor.

    [B]Archivo Global.Asax[/B]
    [CODE]
    < %@ Application Language="C#" %>
    < %@ Import Namespace="System" %>
    < %@ Import Namespace="System.Web" %>
    < %@ Import Namespace="System.Web.SessionState" %>

    [/CODE]

    [B]Archivo Session.aspx.cs[/B]

    [CODE]
    using System;
    using System.Data;
    using System.Configuration;
    using System.Collections;
    using System.Web;
    using System.Web.Security;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using System.Web.UI.WebControls.WebParts;
    using System.Web.UI.HtmlControls;
    using System.Web.SessionState;

    public partial class session : System.Web.UI.Page
    {
    protected void Page_Load(object sender, EventArgs e)
    {
    //Session[«var»] = «nueva de hoy»;

    if (Session[«var»] == null)
    etiqueta.Text = «Variable de session nula!»;
    else
    etiqueta.Text = «var sessi-> » + (string)(Session[«var»]);

    string ap = (string)Application[«app»];
    etiqueta2.Text = ap;

    }
    }
    [/CODE]

    [B]Archivo Session.aspx[/B]

    [CODE]
    < %@ Page Language="C#" AutoEventWireup="true" CodeFile="session.aspx.cs" Inherits="session" %>

    < !DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">



    Untitled Page



    [/CODE]

    PD: Al ejecutar mi aplicacion siempre me dice que la variable Session[«var»] es nula y la variable ap queda vacia… cuando en realidad deberian de tomar los valores «0» y «1» respectivamentee que es lo que les almaceno en global.asax o no se si es que me falta algo… en realidad estoy empezando con asp.net pero esto me ha fregado… muchisimas gracias…

Deja un comentario

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