2017-02-24 65 views
-3

即使在網站停止運行後,我的asp.net網站也會將列表中的項目變量(購物車)保存。這很危險,因爲登錄的其他用戶將看到相同的項目列表(購物車)。 我將項目添加到列表中,然後關閉瀏覽器,然後重新運行網站並將項目添加到購物車,但它仍顯示我在重新打開瀏覽器之前添加的項目。 當我以前使用過一個Web應用程序並且使用了一個非常類似的代碼時,這並沒有發生。有沒有辦法解決這個問題?即使在關閉後,ASP.NET網站也會保存變量

在客戶端,我有一個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; 
     } 

的方法,這是調用從靜態類稱爲訂單班看起來像這樣:

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; 
    } 

在一個名爲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; 
    } 
+2

a [mcve]會有幫助。因爲這可能導致這種情況太多。 –

+0

如果您可以提供一些代碼,那麼確實會幫助您查看問題所在。 – MichaelDotKnox

+0

@ DanielA.White我添加了代碼並希望它符合最小,完整和可驗證的示例標準。請看一看。 –

回答

0

我認爲你的問題是你有靜態類的結果。如果網絡環境不正確,這可能會非常危險。當你有一個靜態類時,有一個競爭條件是非常容易的,其中一個會話設置一個靜態屬性或變量的值,然後由另一個會話使用。

我的建議是您重構將靜態類和靜態方法更改爲非靜態類和方法,並且您的問題很可能會消失。

希望有所幫助。

相關問題