Piszę aplikację internetową, która pozwoli użytkownikowi przeglądać wiele stron internetowych w ramach serwisu, wykonując określone żądania. Wszystkie informacje wprowadzone przez użytkownika będą przechowywane w utworzonym przeze mnie obiekcie. Problem polega na tym, że potrzebuję dostępu do tego obiektu z dowolnej części strony internetowej i tak naprawdę nie znam najlepszego sposobu, aby to osiągnąć. Wiem, że jednym rozwiązaniem jest użycie zmiennych sesji, ale nie wiem, jak ich używać w asp .net MVC. A gdzie zadeklarowałbym zmienną sesyjną? Czy jest inny sposób?
169
Odpowiedzi:
Myślę, że będziesz chciał pomyśleć o tym, czy rzeczy naprawdę pasują do stanu sesji. To jest coś, co robię od czasu do czasu i jest to ładne, mocno wpisane podejście do całej sprawy, ale powinieneś być ostrożny, umieszczając rzeczy w kontekście sesji. Nie wszystko powinno tam być tylko dlatego, że należy do jakiegoś użytkownika.
w global.asax przechwyć zdarzenie OnSessionStart
Z dowolnego miejsca w kodzie, w którym właściwość HttpContext.Current! = Null, można pobrać ten obiekt. Robię to metodą rozszerzającą.
W ten sposób możesz w kodzie
źródło
Odpowiedź tutaj jest prawidłowa, jednak starałem się zaimplementować ją w aplikacji ASP.NET MVC 3. Chciałem uzyskać dostęp do obiektu sesji w kontrolerze i nie mogłem zrozumieć, dlaczego ciągle otrzymuję komunikat „Instancja nie jest ustawiona na wystąpienie błędu obiektu”. Zauważyłem, że w kontrolerze, gdy próbowałem uzyskać dostęp do sesji, wykonując następujące czynności, nadal otrzymywałem ten błąd. Wynika to z faktu, że this.HttpContext jest częścią obiektu Controller.
Jednak chciałem mieć HttpContext, który jest częścią przestrzeni nazw System.Web, ponieważ jest to ten, który odpowiedź sugeruje powyżej, aby użyć w Global.asax.cs. Musiałem więc wyraźnie wykonać następujące czynności:
to mi pomogło, nie jestem pewien, czy zrobiłem coś, co nie jest tutaj MO, ale mam nadzieję, że to komuś pomoże!
źródło
Ponieważ nie lubię widzieć „HTTPContext.Current.Session” o tym miejscu, używam wzorca singleton, aby uzyskać dostęp do zmiennych sesji, co daje łatwy dostęp do zbioru danych o silnym typie.
wtedy możesz uzyskać dostęp do swoich danych z dowolnego miejsca:
źródło
Jeśli używasz asp.net mvc, oto prosty sposób na uzyskanie dostępu do sesji.
Z kontrolera:
Z widoku:
Z pewnością nie jest to najlepszy sposób uzyskiwania dostępu do zmiennych sesji, ale jest to droga bezpośrednia. Dlatego używaj go ostrożnie (najlepiej podczas szybkiego prototypowania) i używaj Wrapper / Container i OnSessionStart, gdy okaże się to odpowiednie.
HTH
źródło
Cóż, IMHO ..
Jeśli chodzi o # 1, mam silnie wpisany widok główny, który ma właściwość dostępu do wszystkiego, co reprezentuje obiekt Session ... w moim przypadku mocno wpisany widok główny jest ogólny, co daje mi pewną elastyczność w odniesieniu do stron widoku z silnym typem
i wtedy...
źródło
Chociaż nie wiem o mvc asp.net, ale to właśnie powinniśmy zrobić w normalnej witrynie sieci Web .NET. Powinien działać również dla asp.net mvc.
Umieściłbyś to w metodzie łatwego dostępu. HTH
źródło
Można to zrobić na 3 sposoby.
Wolę trzeci sposób.Ten link jest dobrym odniesieniem.
Get / Set HttpContext Session Methods in BaseController vs Mocking HttpContextBase to create Get / Set methods
źródło
Moim sposobem na dostęp do sesji jest napisanie klasy pomocniczej, która zawiera różne nazwy pól i ich typy. Mam nadzieję, że ten przykład pomoże:
źródło
Świetne odpowiedzi od chłopaków, ale ostrzegam Cię przed zawsze poleganiem na sesji. Można to zrobić szybko i łatwo i oczywiście zadziała, ale nie będzie świetny w każdych okolicznościach.
Na przykład, jeśli napotkasz scenariusz, w którym Twój hosting nie zezwala na użycie sesji lub jeśli jesteś w farmie sieci Web lub w przykładzie udostępnionej aplikacji SharePoint.
Jeśli potrzebujesz innego rozwiązania, możesz spojrzeć na użycie kontenera IOC, takiego jak Castle Windsor , tworząc klasę dostawcy jako opakowanie, a następnie utrzymując jedną instancję swojej klasy przy użyciu stylu życia na żądanie lub sesji w zależności od wymagań.
MKOl zapewni, że za każdym razem zwracana będzie ta sama instancja.
Bardziej skomplikowane tak, jeśli potrzebujesz prostego rozwiązania, po prostu skorzystaj z sesji.
Oto kilka przykładów realizacji poniżej, które nie są interesujące.
Korzystając z tej metody, można utworzyć klasę dostawcy w następujący sposób:
I zarejestruj to na przykład:
źródło
Możesz użyć ViewModelBase jako klasy bazowej dla wszystkich modeli, ta klasa zajmie się pobieraniem danych z sesji
Możesz napisać metodę rozszerzającą w HttpContextBase, aby radzić sobie z danymi sesji
Użyj tego jak poniżej w kontrolerze
Drugi argument jest opcjonalny, zostanie użyty do wypełnienia danych sesji dla tego klucza, gdy wartość nie jest obecna w sesji.
źródło