Estou escrevendo um aplicativo da Web que permitirá ao usuário navegar em várias páginas da Web no site, fazendo determinadas solicitações. Todas as informações que o usuário inserir serão armazenadas em um objeto que eu criei. O problema é que eu preciso que esse objeto seja acessado de qualquer parte do site e realmente não sei a melhor maneira de fazer isso. Eu sei que uma solução é usar variáveis de sessão, mas não sei como usá-las no asp .net MVC. E onde eu declararia uma variável de sessão? Existe alguma outra maneira?
169
Respostas:
Eu acho que você vai querer pensar se as coisas realmente pertencem a um estado de sessão. Isso é algo que eu me vejo fazendo de vez em quando e é uma boa abordagem fortemente tipada para a coisa toda, mas você deve ter cuidado ao colocar as coisas no contexto da sessão. Nem tudo deve estar lá apenas porque pertence a algum usuário.
no global.asax hook o evento OnSessionStart
De qualquer lugar no código em que a propriedade HttpContext.Current! = Null, você pode recuperar esse objeto. Eu faço isso com um método de extensão.
Desta forma, você pode no código
fonte
A resposta aqui está correta, no entanto, lutei para implementá-lo em um aplicativo ASP.NET MVC 3. Eu queria acessar um objeto Session em um controlador e não conseguia descobrir por que continuava recebendo uma "Instância não definida para uma instância de um erro de Objeto". O que notei é que, em um controlador, quando tentei acessar a sessão, continuei recebendo esse erro. Isso se deve ao fato de que this.HttpContext faz parte do objeto Controller.
No entanto, o que eu queria era o HttpContext que faz parte do espaço para nome System.Web porque esse é o sugerido pela resposta acima no Global.asax.cs. Então eu tive que fazer explicitamente o seguinte:
isso me ajudou, não tenho certeza se fiz algo que não seja MO por aqui, mas espero que ajude alguém!
fonte
Como não gosto de ver "HTTPContext.Current.Session" sobre o local, uso um padrão singleton para acessar variáveis de sessão, oferecendo um fácil acesso a um pacote de dados fortemente tipado.
então você pode acessar seus dados de qualquer lugar:
fonte
Se você estiver usando o asp.net mvc, aqui está uma maneira simples de acessar a sessão.
De um controlador:
De uma vista:
Definitivamente, essa não é a melhor maneira de acessar suas variáveis de sessão, mas é uma rota direta. Portanto, use-o com cuidado (de preferência durante a prototipagem rápida) e use um Wrapper / Container e OnSessionStart quando for apropriado.
HTH
fonte
Bem, IMHO ..
No que diz respeito ao item 1, eu tenho uma Visualização mestra fortemente tipada, que possui uma propriedade para acessar o que o objeto Session representa .... no meu caso, a Visualização mestra tipicamente digitada é genérica, o que me dá alguma flexibilidade em relação às Páginas vitais fortemente tipadas
e depois...
fonte
Embora eu não conheça o asp.net mvc, é o que devemos fazer em um site .net normal. Também deve funcionar para o asp.net mvc.
Você colocaria isso dentro de um método para facilitar o acesso. HTH
fonte
Existem 3 maneiras de fazer isso.
Eu prefiro a terceira via. Este link é uma boa referência.
Obter / definir métodos de sessão HttpContext em BaseController vs Mocking HttpContextBase para criar métodos Get / Set
fonte
Minha maneira de acessar as sessões é escrever uma classe auxiliar que encapsule os vários nomes de campos e seus tipos. Espero que este exemplo ajude:
fonte
Ótimas respostas dos rapazes, mas eu aconselho você a não confiar sempre na Sessão. É rápido e fácil, e é claro que funcionaria, mas não seria ótimo em todas as circunstâncias.
Por exemplo, se você se deparar com um cenário em que sua hospedagem não permita o uso da sessão, ou se você estiver em um farm da web ou no exemplo de um aplicativo compartilhado do SharePoint.
Se você queria uma solução diferente, poderia usar um contêiner do COI como o Castle Windsor , criar uma classe de provedor como um wrapper e, em seguida, manter uma instância da sua classe usando o estilo de vida por solicitação ou sessão, dependendo de seus requisitos.
O COI garantiria que a mesma instância fosse retornada toda vez.
Mais complicado, sim, se você precisar de uma solução simples, basta usar a sessão.
Aqui estão alguns exemplos de implementação abaixo sem interesse.
Usando este método, você pode criar uma classe de provedor ao longo das linhas de:
E registre algo como:
fonte
Você pode usar o ViewModelBase como classe base para todos os modelos; essa classe cuidará de extrair dados da sessão
Você pode escrever um método de extensão no HttpContextBase para lidar com os dados da sessão
Use isso como abaixo no controlador
O segundo argumento é opcional, ele será usado para preencher os dados da sessão dessa chave quando o valor não estiver presente na sessão.
fonte