Saltar al contenido

Variables de sesión en ASP.NET MVC

Solución:

Creo que querrás pensar si las cosas realmente pertenecen a un estado de sesión. Esto es algo que me encuentro haciendo de vez en cuando y es un buen enfoque fuertemente tipado para todo el asunto, pero debe tener cuidado al poner las cosas en el contexto de la sesión. No todo debería estar ahí solo porque pertenece a algún usuario.

en global.asax engancha el evento OnSessionStart

void OnSessionStart(...)
{
    HttpContext.Current.Session.Add("__MySessionObject", new MySessionObject());
}

Desde cualquier lugar del código donde la propiedad HttpContext.Current! = Null puede recuperar ese objeto. Hago esto con un método de extensión.

public static MySessionObject GetMySessionObject(this HttpContext current)
{
    return current != null ? (MySessionObject)current.Session["__MySessionObject"] : null;
}

De esta manera puedes en código

void OnLoad(...)
{
    var sessionObj = HttpContext.Current.GetMySessionObject();
    // do something with 'sessionObj'
}

La respuesta aquí es correcta, sin embargo, tuve problemas para implementarla en una aplicación ASP.NET MVC 3. Quería acceder a un objeto Session en un controlador y no podía entender por qué seguía obteniendo una “Instancia no configurada para una instancia de un error de Objeto”. Lo que noté es que en un controlador cuando intenté acceder a la sesión haciendo lo siguiente, seguí obteniendo ese error. Esto se debe al hecho de que this.HttpContext es parte del objeto Controller.

this.Session["blah"]
// or
this.HttpContext.Session["blah"]

Sin embargo, lo que quería era el HttpContext que es parte del espacio de nombres System.Web porque este es el que la Respuesta anterior sugiere usar en Global.asax.cs. Entonces tuve que hacer explícitamente lo siguiente:

System.Web.HttpContext.Current.Session["blah"]

esto me ayudó, no estoy seguro de si hice algo que no sea MO por aquí, ¡pero espero que ayude a alguien!

Debido a que no me gusta ver “HTTPContext.Current.Session” sobre el lugar, utilizo un patrón singleton para acceder a las variables de sesión, lo que le brinda una bolsa de datos fuertemente tipada de fácil acceso.

[Serializable]
public sealed class SessionSingleton
{
    #region Singleton

    private const string SESSION_SINGLETON_NAME = "Singleton_502E69E5-668B-E011-951F-00155DF26207";

    private SessionSingleton()
    {

    }

    public static SessionSingleton Current
    {
        get
        {
            if ( HttpContext.Current.Session[SESSION_SINGLETON_NAME] == null )
            {
                HttpContext.Current.Session[SESSION_SINGLETON_NAME] = new SessionSingleton();
            }

            return HttpContext.Current.Session[SESSION_SINGLETON_NAME] as SessionSingleton;
        }
    }

    #endregion

    public string SessionVariable { get; set; }
    public string SessionVariable2 { get; set; }

    // ...

entonces puede acceder a sus datos desde cualquier lugar:

SessionSingleton.Current.SessionVariable = "Hello, World!";
¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

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