Como usar sessões em um aplicativo ASP.NET MVC 4?

Eu sou novo no ASP.NET MVC. Eu usei o PHP antes e foi fácil criar uma session e selecionar registros do usuário com base nas variables ​​da session atual.

Eu procurei em todos os lugares na Internet por um simples tutorial passo-a-passo que pode me mostrar como criar e usar sessões no meu aplicativo C # ASP.NET MVC 4. Eu quero criar uma session com variables ​​de usuário que eu possa acessar de qualquer lugar em meus controladores e ser capaz de usar as variables ​​em minhas consultas LINQ.

-Desde já, obrigado!

    Experimentar

    //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; //to clear the session value Session["products"]=null; 

    Devido à natureza sem estado da web, as sessões também são uma maneira extremamente útil de persistir objects nas solicitações, serializando-as e armazenando-as em uma session.

    Um caso de uso perfeito disso pode ser se você precisar acessar informações regulares em seu aplicativo, para salvar chamadas de database adicionais em cada solicitação, esses dados podem ser armazenados em um object e não serializados em cada solicitação, da seguinte maneira:

    Nosso object reutilizável serializável:

     [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 */ } } 

    Uma vez que este object tenha sido serializado, podemos usá-lo em todos os controladores sem precisar criá-lo ou consultar o database para os dados contidos nele novamente.

    Injetar seu object de session usando injeção de dependência

    Em um mundo ideal, você iria ‘ programar para uma interface, não implementação ‘ e injetar seu object de session serializável em seu controlador usando seu contêiner de Inversão de Controle de preferência, assim (este exemplo usa o StructureMap como o que eu estou mais familiarizado com ).

     public class WebsiteRegistry : Registry { public WebsiteRegistry() { this.For().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; } } 

    Você registraria isso em seu arquivo Global.asax.cs .

    Para aqueles que não estão familiarizados com a injeção de objects de session, você pode encontrar uma postagem mais aprofundada sobre o assunto aqui .

    Uma palavra de alerta:

    Vale a pena notar que as sessões devem ser reduzidas ao mínimo, e sessões grandes podem começar a causar problemas de desempenho.

    Também é recomendado não armazenar nenhum dado confidencial neles (senhas, etc).

    É assim que o estado da session funciona no ASP.NET e no ASP.NET MVC:

    Visão geral do estado da session do ASP.NET

    Basicamente, você faz isso para armazenar um valor no object Session:

     Session["FirstName"] = FirstNameTextBox.Text; 

    Para recuperar o valor:

     var firstName = Session["FirstName"]; 

    U pode armazenar qualquer valor em session como Session [“FirstName”] = FirstNameTextBox.Text; mas eu sugiro que você tome como campo estático no modelo atribuir valor a ele e você pode acessar esse valor de campo em qualquer lugar na aplicação. Você não precisa de session. session deve ser evitada.

     public class Employee { public int UserId { get; set; } public string EmailAddress { get; set; } public static string FullName { get; set; } } 

    no controlador – Employee.FullName = “ABC”; Agora você pode acessar este nome completo em qualquer lugar do aplicativo.