asp.net-mvc - datos - filtro de busqueda mvc
¿Cómo usar las sesiones en una aplicación ASP.NET MVC 4? (4)
Soy nuevo en ASP.NET MVC. He usado PHP antes y fue fácil crear una sesión y seleccionar registros de usuarios basados en las variables de sesión actuales.
He buscado en todas partes en Internet un sencillo tutorial paso a paso que puede mostrarme cómo crear y usar sesiones en mi aplicación C # ASP.NET MVC 4. Quiero crear una sesión con variables de usuario a las que pueda acceder desde cualquier lugar en mis controladores y ser capaz de usar las variables en mis consultas LINQ.
-¡Gracias por adelantado!
Así es como funciona el estado de sesión en ASP.NET y ASP.NET MVC:
ASP.NET Descripción general del estado de la sesión
Básicamente, haces esto para almacenar un valor en el objeto Session:
Session["FirstName"] = FirstNameTextBox.Text;
Para recuperar el valor:
var firstName = Session["FirstName"];
Debido a la naturaleza apátrida de la web, las sesiones también son una forma extremadamente útil de persistir objetos a través de solicitudes serializándolos y almacenándolos en una sesión.
Un caso de uso perfecto de esto podría ser si necesita acceder a información regular en su aplicación, para guardar llamadas a la base de datos adicionales en cada solicitud, estos datos pueden almacenarse en un objeto y ser deserializados en cada solicitud, así:
Nuestro objeto reutilizable y serializable:
[Serializable]
public class UserProfileSessionData
{
public int UserId { get; set; }
public string EmailAddress { get; set; }
public string FullName { get; set; }
}
Caso de uso:
public class LoginController : Controller {
[HttpPost]
public ActionResult Login(LoginModel model)
{
if (ModelState.IsValid)
{
var profileData = new UserProfileSessionData {
UserId = model.UserId,
EmailAddress = model.EmailAddress,
FullName = model.FullName
}
this.Session["UserProfile"] = profileData;
}
}
public ActionResult LoggedInStatusMessage()
{
var profileData = this.Session["UserProfile"] as UserProfileSessionData;
/* From here you could output profileData.FullName to a view and
save yourself unnecessary database calls */
}
}
Una vez que este objeto ha sido serializado, podemos usarlo en todos los controladores sin necesidad de crearlo o consultar nuevamente la base de datos para los datos contenidos en él.
Inyecte su objeto de sesión usando Dependency Injection
En un mundo ideal, deberías '' programar a una interfaz, no a la implementación '' e inyectar tu objeto de sesión serializable en tu controlador usando tu contenedor de Inversión de control de tu elección, como ese (este ejemplo usa StructureMap ya que es con el que estoy más familiarizado )
public class WebsiteRegistry : Registry
{
public WebsiteRegistry()
{
this.For<IUserProfileSessionData>().HybridHttpOrThreadLocalScoped().Use(() => GetUserProfileFromSession());
}
public static IUserProfileSessionData GetUserProfileFromSession()
{
var session = HttpContext.Current.Session;
if (session["UserProfile"] != null)
{
return session["UserProfile"] as IUserProfileSessionData;
}
/* Create new empty session object */
session["UserProfile"] = new UserProfileSessionData();
return session["UserProfile"] as IUserProfileSessionData;
}
}
A continuación, registraría esto en su archivo Global.asax.cs
.
Para aquellos que no están familiarizados con la inyección de objetos de sesión, aquí pueden encontrar una publicación de blog más detallada sobre el tema.
Una palabra de advertencia:
Vale la pena señalar que las sesiones deben mantenerse al mínimo, las sesiones grandes pueden comenzar a causar problemas de rendimiento.
También se recomienda no almacenar ningún dato sensible en ellos (contraseñas, etc.).
Tratar
//adding data to session
//assuming the method below will return list of Products
var products=Db.GetProducts();
//Store the products to a session
Session["products"]=products;
//To get what you have stored to a session
var products=Session["products"] as List<Product>;
//to clear the session value
Session["products"]=null;
U puede almacenar cualquier valor en sesión como Session ["FirstName"] = FirstNameTextBox.Text; pero le sugiero tomar como campo estático en el modelo asignarle valor y puede acceder al valor de ese campo en cualquier lugar de la aplicación. U no necesita sesión la sesión debe ser evitada.
public class Employee
{
public int UserId { get; set; }
public string EmailAddress { get; set; }
public static string FullName { get; set; }
}
en el controlador - Employee.FullName = "ABC"; Ahora puede acceder a este Nombre completo en cualquier lugar de la aplicación.