ukládání nákupního košíku do session   otázka

VB.NET, ASP.NET WebForms, ASP.NET MVC, Algoritmy

Dobrý den,

prosím o naléhavou pomoc s ukládáním nákupního košíku do session.

Po dlouhé době se mi podařilo vytvořit nákupní košík, který zajišťuje veškerou funkcionalitu a používá k ukládání session ...

Vše jsem testoval na svém PC a zdálo se, že vše funguje jak má a proto jsem umístil stránky na www.aquacoolers.com ...

A tady je problém ...

Jak se ukázalo při testování od více uživatelů, nákupní košík je společný pro všechny. To znamená, že když někdo vloží položku do košíku, tato položka se zobrazí i úplně jiného uživatele ...

Můžete mi prosím někdo poradit co mám udělat ...

Díky mooooc ....

PS: Zde je kus kódu, který používám pro ukládání košíku ...

<Serializable()> _
Public Class ShoppingCart

    Private _items As List(Of CartItem)
    Public Property Items() As List(Of CartItem)
        Get
            Return _items
        End Get
        Set(ByVal value As List(Of CartItem))
            _items = value
        End Set
    End Property

#End Region

#Region "Implementace session"

    Public Shared ReadOnly Instance As ShoppingCart
    Shared Sub New()
        'Jesliže košík v session ještě není, vytvoří jej a vloží ho do session
        'Jestliže již košík existuje načte jej ze session
        If HttpContext.Current.Session("AQUAShoppingCart") Is Nothing Then
            Instance = New ShoppingCart()
            Instance.Items = New List(Of CartItem)
            HttpContext.Current.Session("AQUAShoppingCart") = Instance
        Else
            Instance = CType(HttpContext.Current.Session("AQUAShoppingCart"), ShoppingCart)
        End If
    End Sub

    'Konstruktor chránící před vytvořením z venku
    Protected Sub New()

    End Sub


atd ......

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Proměnnou Instance nesmíte mít deklarovanou jako Shared, protože pak je statická a je sdílená v rámci celé aplikace. Inicializujete ji opět ve statickém konstruktoru, který se také spouští jen jednou pro celou aplikaci.

Proměnnou Instance změňte na readonly vlastnost a kód ze statického konstruktoru dejte do getteru této vlastnosti, pak to bude fungovat.

Public Shared ReadOnly Property Instance As ShoppingCart
    Get
        'Jesliže košík v session ještě není, vytvoří jej a vloží ho do session
        'Jestliže již košík existuje načte jej ze session
        If HttpContext.Current.Session("AQUAShoppingCart") Is Nothing Then
            Dim Instance = New ShoppingCart()
            Instance.Items = New List(Of CartItem)
            HttpContext.Current.Session("AQUAShoppingCart") = Instance
            Return Instance
        Else
            Dim Instance = CType(HttpContext.Current.Session("AQUAShoppingCart"), ShoppingCart)
            Return Instance
        End If
    End Sub

nahlásit spamnahlásit spam 2 / 2 odpovědětodpovědět

Děkuji za pomoc, ale jsem amatér a nevím přesně co myslíte tím

"a kód ze statického konstruktoru dejte do getteru této vlastnosti" ...

Nešlo by to prosím v kódu ...

Díky

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Vždyť jsem vám ten kód sem poslal, místo té proměnné a Shared Sub New (statický konstruktor) dejte to, to je v mé předchozí odpovědi.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Aha, mě tam mátlo to s tím konstruktorem, pochopil jsem to tak, že ten kód mám dát i tam ...

Teď už je to funkční, ale je tu ještě malá drobnost ...

Košíky už se nijak neovlivňují, ale nepřežijí zavření prohlížeče což bych ještě rád upravil ....

#Region "Implementace session"

    Public Shared ReadOnly Property Instance() As ShoppingCart
        Get
            'Jesliže košík v session ještě není, vytvoří jej a vloží ho do session
            'Jestliže již košík existuje načte jej ze session
            If HttpContext.Current.Session("AQUAShoppingCart") Is Nothing Then
                Instance = New ShoppingCart()
                Instance.Items = New List(Of CartItem)
                HttpContext.Current.Session("AQUAShoppingCart") = Instance
                Return Instance
            Else
                Instance = CType(HttpContext.Current.Session("AQUAShoppingCart"), ShoppingCart)
                Return Instance
            End If
        End Get
    End Property

    'Konstruktor chránící před vytvořením z venku
    Protected Sub New()

    End Sub

#End Region

Mockrát Vám děkuji ...

nahlásit spamnahlásit spam 0 odpovědětodpovědět

http://www.aspnet.cz/Articles/193-stavov...

Tohle session pokud vím neumí, ukončení a znovuzapnutí prohlížeče nezvládne. Jediná možnost, jak to elegantně vyřešit, je udělat registrace uživatelů a košík ukládat do databáze pro přihlášeného uživatele.

nahlásit spamnahlásit spam 0 odpovědětodpovědět
                       
Nadpis:
Antispam: Komu se občas házejí perly?
Příspěvek bude publikován pod identitou   anonym.
  • Administrátoři si vyhrazují právo komentáře upravovat či mazat bez udání důvodu.
    Mazány budou zejména komentáře obsahující vulgarity nebo porušující pravidla publikování.
  • Pokud nejste zaregistrováni, Vaše IP adresa bude zveřejněna. Pokud s tímto nesouhlasíte, příspěvek neodesílejte.

přihlásit pomocí externího účtu

přihlásit pomocí jména a hesla

Uživatel:
Heslo:

zapomenuté heslo

 

založit nový uživatelský účet

zaregistrujte se

 
zavřít

Nahlásit spam

Opravdu chcete tento příspěvek nahlásit pro porušování pravidel fóra?

Nahlásit Zrušit

Chyba

zavřít

feedback