Здесь есть ряд проблем.Во-первых, если вы добавляете к своему ArrayList
вот так:
shoppingCart.Add(newProduct)
, тогда вы добавляете Product
объектов.В таком случае, почему вы ожидаете, что это будет полезно:
If (shoppingCart.Contains(newProduct.itemID)) Then
newProduct.itemID
предположительно Integer
или тому подобное, поэтому, конечно, коллекция не содержит его.Он не содержит значений Integer
, поскольку содержит объекты Product
.Вам необходимо проверить, содержит ли он объект Product
с этим itemID
, а не содержит ли он непосредственно itemID
.Я заменил бы все это:
If Session("shoppingCartSession") Is Nothing Then
shoppingCart = New ArrayList()
shoppingCart.Add(newProduct)
Session("shoppingCartSession") = shoppingCart
ElseIf (shoppingCart.Contains(newProduct.itemID)) Then
For Each item As Product In shoppingCart
If item.Equals(Request.QueryString("ProductCode")) Then
item.updateQuantity()
End If
Next
Else
shoppingCart = CType(Session("shoppingCartSession"), ArrayList)
shoppingCart.Add(newProduct)
Session.Add("shoppingCartSession", shoppingCart)
End If
на это:
shoppingCart = TryCast(Session("shoppingCartSession"), ArrayList)
If shoppingCart Is Nothing Then
shoppingCart = New ArrayList
Session("shoppingCartSession") = shoppingCart
End If
Dim existingProduct = shoppingCart.Cast(Of Product)().
SingleOrDefault(Function(p) p.itemID = newProduct.itemID)
If existingProduct Is Nothing Then
shoppingCart.Add(newProduct)
Else
existingProduct.updateQualtity()
End If
Тем не менее, я также буду следовать предложению @VisualVincent и использовать List(Of Product)
вместо ArrayList
.Если вы сделаете это, то можете пропустить вызов Cast
в предложенном мной коде.