Estoy escribiendo una aplicación web que permitirá a un usuario navegar por varias páginas web dentro del sitio web haciendo ciertas solicitudes. Toda la información que ingrese el usuario se almacenará en un objeto que creé. El problema es que necesito acceder a este objeto desde cualquier parte del sitio web y realmente no sé la mejor manera de lograrlo. Sé que una solución es usar variables de sesión, pero no sé cómo usarlas en asp .net MVC. ¿Y dónde declararía una variable de sesión? ¿Hay alguna otra manera?
169
Respuestas:
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 de todo, pero debes tener cuidado al poner las cosas en el contexto de la sesión. No todo debería estar allí solo porque pertenece a algún usuario.
en global.asax conecta el evento OnSessionStart
Desde cualquier parte del código donde la propiedad HttpContext.Current! = Null puede recuperar ese objeto. Hago esto con un método de extensión.
De esta manera puedes en código
fuente
La respuesta aquí es correcta, sin embargo, tuve problemas para implementarlo en una aplicación ASP.NET MVC 3. Quería acceder a un objeto de sesión en un controlador y no podía entender por qué seguía obteniendo una "Instancia no establecida en 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í recibiendo ese error. Esto se debe al hecho de que this.HttpContext es parte del objeto Controller.
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. Así que tuve que hacer explícitamente lo siguiente:
esto me ayudó, no estoy seguro si hice algo que no sea MO por aquí, ¡pero espero que ayude a alguien!
fuente
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, le brinda una bolsa de datos fuertemente tipada fácil de acceder.
entonces puede acceder a sus datos desde cualquier lugar:
fuente
Si está utilizando asp.net mvc, aquí hay una forma sencilla de acceder a la sesión.
De un controlador:
Desde una vista:
Definitivamente, esta no es la mejor manera de acceder a las variables de sesión, pero es una ruta directa. Por lo tanto, úselo con precaución (preferiblemente durante la creación rápida de prototipos) y use un Contenedor / Contenedor y OnSessionStart cuando sea apropiado.
HTH
fuente
Bueno, en mi humilde opinión ..
Con respecto al n. ° 1, tengo una vista maestra fuertemente tipada que tiene una propiedad para acceder a lo que sea que represente el objeto Session ... en mi caso, la vista maestra tipada es genérica, lo que me da cierta flexibilidad con respecto a las páginas de vista fuertemente tipadas
y entonces...
fuente
Aunque no sé acerca de asp.net mvc, esto es lo que deberíamos hacer en un sitio web .net normal. También debería funcionar para asp.net mvc.
Pondría esto dentro de un método para facilitar el acceso. HTH
fuente
Hay 3 formas de hacerlo.
Prefiero la tercera forma. Este enlace es una buena referencia.
Métodos de sesión Get / Set HttpContext en BaseController vs Mocking HttpContextBase para crear métodos Get / Set
fuente
Mi forma de acceder a las sesiones es escribir una clase auxiliar que encapsule los diversos nombres de campo y sus tipos. Espero que este ejemplo ayude:
fuente
Grandes respuestas de los muchachos, pero les advierto que no confíen siempre en la sesión. Es rápido y fácil hacerlo, y por supuesto funcionaría, pero no sería excelente en todas las circunstancias.
Por ejemplo, si se encuentra con un escenario en el que su alojamiento no permite el uso de la sesión, o si se encuentra en una granja de servidores web, o en el ejemplo de una aplicación de SharePoint compartida.
Si desea una solución diferente, puede utilizar un contenedor IOC como Castle Windsor , crear una clase de proveedor como envoltorio y luego mantener una instancia de su clase utilizando el estilo de vida por solicitud o sesión, según sus requisitos.
El COI se aseguraría de que se devuelva la misma instancia cada vez.
Más complicado sí, si necesita una solución simple, simplemente use la sesión.
Estos son algunos ejemplos de implementación a continuación por interés.
Con este método, podría crear una clase de proveedor en la línea de:
Y regístralo algo como:
fuente
Puede usar ViewModelBase como clase base para todos los modelos, esta clase se encargará de extraer datos de la sesión
Puede escribir un método de extensión en HttpContextBase para tratar con datos de sesión
Use esto como a continuación en el controlador
El segundo argumento es opcional, se usará para llenar datos de sesión para esa clave cuando el valor no esté presente en la sesión.
fuente