ASP.NET网站即使在关闭后也会保存变量

时间:2017-02-24 13:22:33

标签: c# asp.net web

我的asp.net网站即使在网站停止运行后也会保存列表中的项目变量(购物车)。这很危险,因为登录的其他用户将看到相同的项目列表(购物车)。 我将项目添加到列表中,然后关闭浏览器,然后我重新运行网站并将项目添加到购物车,但它仍然显示我在重新打开浏览器之前添加的项目。 当我之前使用Web应用程序并使用非常相似的代码时,这不会发生。有没有办法解决这个问题?

在客户端,我有一个装满购物项目的gridview,并带有添加到购物车的按钮:

protected void GridView1_RowCommand(object sender, GridViewCommandEventArgs e)
    {
        if (e.CommandName == "AddToCart")
        {
            int rowIndex = ((GridViewRow)((Button)e.CommandSource).NamingContainer).RowIndex;
            GridViewRow row = GridView1.Rows[rowIndex];
            Label ID = (Label)row.FindControl("lblItemId");
            int itemID = Convert.ToInt32(ID.Text);
            lstCart.Items.Clear();
            OrderClass.AddToCart(itemID);
            lstCart.DataSource = OrderClass.ViewAllOrderItem();
            lstCart.DataBind();

            Button clicked = (Button)row.FindControl("btnAddToCart");
            clicked.Enabled = false;

            Button remove = (Button)row.FindControl("btnRemoveFromCart");
            remove.Visible = true;
        }

这个调用的方法来自名为order class的静态类,如下所示:

private static List<Tuple<string, string>> allItems = new List<Tuple<string, string>>();
    private static List<string> itemList;

     public static void AddToCart(int itemID)
        {
            ItemCart.Add(itemID);
        }

作为数据源的方法,列表框显示购物车中的所有商品如下:

public static List<string> ViewAllOrderItem()
    {
        allItems = ItemCart.GetAllOrderItems();
        itemList = new List<string>();
        foreach (Tuple<string, string> eachItem in allItems)
        {
            itemList.Add("Item Name= " + eachItem.Item1 + " , Price= " + eachItem.Item2);
        }
        return itemList;
    }

此Order类调用的名为Itemcart的静态类中的方法是

private static List<int> orderItems = new List<int>();

     public static void Add(int itemID)
        {
            orderItems.Add(itemID);
        }

public static List<Tuple<string,string>> GetAllOrderItems()
    {
        return ShoppingItems.GetItems(orderItems);       
    }

ItemCart调用的静态类购物项中的方法是:

public static List<Tuple<string, string>> GetItems(List<int> itemID)
    {
        List<Tuple<string, string>> currentItemsList = new List<Tuple<string, string>>();

        using (DataConnection con = new DataConnection())
        {
            foreach (int i in itemID)
            {
                string itemName = con.GolfItems.Where(gi => gi.ItemID == i).Select(gi => gi.ItemName).FirstOrDefault();
                string itemPrice = con.GolfItems.Where(gi => gi.ItemID == i).Select(gi => gi.ItemPrice).FirstOrDefault();
                currentItemsList.Add(Tuple.Create(itemName, itemPrice));
            }
        }
        return currentItemsList;
    } 

1 个答案:

答案 0 :(得分:0)

我认为您的问题是您拥有的静态类的结果。如果未正确完成,这在Web环境中可能非常危险。当你有一个静态类时,很容易产生竞争条件,其中一个会话在静态属性或变量上设置值,然后由另一个会话使用。

我的建议是你重构将静态类和静态方法更改为非静态类和方法,你的问题很可能就会消失。

希望有所帮助。