• Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 1833
  • Last Modified:

C# ASP.net Shopping cart

Using examples I crated shopping cart,
But  issue is if i add any products , its will appear all the other client web browser.
for that i need to add unique Cart identifier.
Could you please show me where i have to use that code i already attached my code
using System.Collections.Generic;
using System.Web;

/**
 * The ShoppingCart class
 * 
 * Holds the items that are in the cart and provides methods for their manipulation
 */
public class ShoppingCart
{
    #region Properties

    public List<CartItem> Items { get; private set; }

    #endregion

    #region Singleton Implementation

    // Readonly properties can only be set in initialization or in a constructor
    public static readonly ShoppingCart Instance;
    public const string CartSessionKey = "CartId";
    // The static constructor is called as soon as the class is loaded into memory
    static ShoppingCart()
    {
        // If the cart is not in the session, create one and put it there
        // Otherwise, get it from the session
        if (HttpContext.Current.Session[CartSessionKey] == null)
        {
            Instance = new ShoppingCart();
            Instance.Items = new List<CartItem>();
            HttpContext.Current.Session[CartSessionKey] = Instance;
        }
        else
        {
            Instance = (ShoppingCart)HttpContext.Current.Session["ASPNETShoppingCart"];
        }
    }

    // A protected constructor ensures that an object can't be created from outside
    protected ShoppingCart() { }

    #endregion

    #region Item Modification Methods
    /**
	 * AddItem() - Adds an item to the shopping 
	 */
    public void AddItem(int productId)
    {
        // Create a new item to add to the cart
        CartItem newItem = new CartItem(productId);

        // If this item already exists in our list of items, increase the quantity
        // Otherwise, add the new item to the list
        if (Items.Contains(newItem))
        {
            foreach (CartItem item in Items)
            {
                if (item.Equals(newItem))
                {
                    item.Quantity++;
                    return;
                }
            }
        }
        else
        {
            newItem.Quantity = 1;
            Items.Add(newItem);
        }
    }

    /**
     * SetItemQuantity() - Changes the quantity of an item in the cart
     */
    public void SetItemQuantity(int productId, int quantity)
    {
        // If we are setting the quantity to 0, remove the item entirely
        if (quantity == 0)
        {
            RemoveItem(productId);
            return;
        }

        // Find the item and update the quantity
        CartItem updatedItem = new CartItem(productId);

        foreach (CartItem item in Items)
        {
            if (item.Equals(updatedItem))
            {
                item.Quantity = quantity;
                return;
            }
        }
    }

    public string GetCartId()
    {
        if (HttpContext.Current.Session[CartSessionKey] == null)
        {
            if (!string.IsNullOrWhiteSpace(HttpContext.Current.User.Identity.Name))
            {
                HttpContext.Current.Session[CartSessionKey] = HttpContext.Current.User.Identity.Name;
            }
            else
            {
                // Generate a new random GUID using System.Guid class.     
                Guid tempCartId = Guid.NewGuid();
                HttpContext.Current.Session[CartSessionKey] = tempCartId.ToString();
            }
        }
        return HttpContext.Current.Session[CartSessionKey].ToString();
    }
    
    /**
     * RemoveItem() - Removes an item from the shopping cart
     */
    public void RemoveItem(int productId)
    {
        CartItem removedItem = new CartItem(productId);
        Items.Remove(removedItem);
    }
    #endregion

    #region Reporting Methods
    /**
	 * GetSubTotal() - returns the total price of all of the items
	 *                 before tax, shipping, etc.
	 */
    public decimal GetSubTotal()
    {
        decimal subTotal = 0;
        foreach (CartItem item in Items)
            subTotal += item.TotalPrice;

        return subTotal;
    }
    #endregion
}

Open in new window

0
ukerandi
Asked:
ukerandi
  • 3
  • 2
1 Solution
 
käµfm³d 👽Commented:
Why are you using a singleton pattern for something that should be configured per user?
0
 
ukerandiAuthor Commented:
I used becuase example used "singleton pattern", Shopping cart is working well, only issue
is how to give user to unique number,
I need to add some customer unique key for following method
public void AddItem(int productId)
    {
        // Create a new item to add to the cart
        CartItem newItem = new CartItem(productId);

        // If this item already exists in our list of items, increase the quantity
        // Otherwise, add the new item to the list
        if (Items.Contains(newItem))
        {
            foreach (CartItem item in Items)
            {
                if (item.Equals(newItem))
                {
                    item.Quantity++;
                    return;
                }
            }
        }
        else
        {
            newItem.Quantity = 1;
            Items.Add(newItem);
        }
    }

Open in new window

or someone let me know better way with example
0
 
lenordisteCommented:
kaufmed is right, the singleton pattern does not make any sense in this context. Either make it non static or find a better working shopping cart example.

Anyhow, you can try replacing this:
    // Readonly properties can only be set in initialization or in a constructor
     public static readonly ShoppingCart Instance; 
    public const string CartSessionKey = "CartId";
    // The static constructor is called as soon as the class is loaded into memory
    static ShoppingCart()
    {
        // If the cart is not in the session, create one and put it there
        // Otherwise, get it from the session
        if (HttpContext.Current.Session[CartSessionKey] == null)
        {
            Instance = new ShoppingCart();
            Instance.Items = new List<CartItem>();
            HttpContext.Current.Session[CartSessionKey] = Instance;
        }
        else
        {
            Instance = (ShoppingCart)HttpContext.Current.Session["ASPNETShoppingCart"];
        }
    }

Open in new window


with the following code to have one shopping cart per session (and hence per user):
    // Readonly properties can only be set in initialization or in a constructor
    public const string CartSessionKey = "CartId";
    public static ShoppingCart Instance
    {
      get{
        // If the cart is not in the session, create one and put it there
        // Otherwise, get it from the session
        if (HttpContext.Current.Session[CartSessionKey] == null)
        {
            var instance = new ShoppingCart();
            instance.Items = new List<CartItem>();
            HttpContext.Current.Session[CartSessionKey] = instance;
            return instance;
        }
        else
        {
            return (ShoppingCart)HttpContext.Current.Session[CartSessionKey];
        }
      }
    }

Open in new window


This should be working, even though I find the example code a bit "weird" :-) Cheers.
0
Cloud Class® Course: Microsoft Azure 2017

Azure has a changed a lot since it was originally introduce by adding new services and features. Do you know everything you need to about Azure? This course will teach you about the Azure App Service, monitoring and application insights, DevOps, and Team Services.

 
lenordisteCommented:
I just googled your code and found many related posts. There are two ways to solve the issue (the first one is similar to mine so even though i did not test it, it will probably work):
http://stackoverflow.com/questions/7779906/static-asp-net-session-for-all-users
http://stackoverflow.com/questions/10250288/c-sharp-shopping-cart
0
 
ukerandiAuthor Commented:
lenordiste : are Excellent programmer
if you could explain little bit more how you did i'll appreciated
0
 
ukerandiAuthor Commented:
Excellent, Great i have no words to thank you
0
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

Join & Write a Comment

Featured Post

Cloud Class® Course: Certified Penetration Testing

This CPTE Certified Penetration Testing Engineer course covers everything you need to know about becoming a Certified Penetration Testing Engineer. Career Path: Professional roles include Ethical Hackers, Security Consultants, System Administrators, and Chief Security Officers.

  • 3
  • 2
Tackle projects and never again get stuck behind a technical roadblock.
Join Now