Como usar sessões em uma aplicação ASP.NET MVC 4?

Eu sou novo no ASP.NET MVC. Eu já usei PHP antes e foi fácil criar uma sessão e selecionar registros de usuários com base nas variáveis da sessão atual.

Procurei em toda parte na Internet por um simples tutorial passo a passo que pode me mostrar como criar e usar sessões na minha aplicação C# ASP.NET MVC 4. Eu quero criar uma sessão com variáveis de usuário que eu possa acessar de qualquer lugar nos meus controladores e ser capaz de usar as variáveis nas minhas consultas LINQ.

-Graças adiantadas!

Solução

Experimente

//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;
Comentários (9)

Devido à natureza stateless da web, as sessões são também uma forma extremamente útil de persistir objetos através de pedidos, seriando-os e armazenando-os em uma sessão.

Um caso de uso perfeito disso pode ser se você precisar acessar informações regulares em toda a sua aplicação, para salvar chamadas de banco de dados adicionais em cada pedido, esses dados podem ser armazenados em um objeto e não serializados em cada pedido, assim:

O nosso objecto reutilizável e reutilizável em série:

[Serializable]
public class UserProfileSessionData
{
    public int UserId { get; set; }

    public string EmailAddress { get; set; }

    public string FullName { get; set; }
}

Uso caso:

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 objeto tenha sido serializado, podemos usá-lo em todos os controladores sem precisar criá-lo ou consultar a base de dados para os dados contidos nele novamente.

**Injete seu objeto de sessão usando Injeção de Dependência***

Em um mundo ideal você 'programaria para uma interface, não implementação' e injetaria seu objeto de sessão serializável em seu controlador usando seu recipiente de Inversão de Controle de escolha, assim (este exemplo usa StructureMap como ele'é o que I'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ê então registraria isto no seu arquivo `Global.asax.cs'.

Para aqueles que estão'não familiarizados com objetos da sessão de injeção, você pode encontrar um post de blog mais aprofundado sobre o assunto aqui.

Uma palavra de aviso:

É importante notar que as sessões devem ser mantidas a um mínimo, as grandes sessões podem começar a causar problemas de desempenho.

It's também é recomendado não armazenar neles quaisquer dados sensíveis (senhas, etc).

Comentários (3)

É assim que o estado da sessão funciona em ASP.NET e ASP.NET MVC:

Visão Geral do Estado da Sessão ASP.NET

Basicamente, isto é feito para armazenar um valor no objeto Sessão:

Session["FirstName"] = FirstNameTextBox.Text;

Para recuperar o valor:

var firstName = Session["FirstName"];
Comentários (3)