2017-02-24 4 views
-3

내 asp.net 웹 사이트는 웹 사이트 실행이 중지 된 후에도 목록의 변수 (장바구니)를 저장합니다. 로그인하는 다른 사용자가 동일한 항목 목록 (쇼핑 카트)을 보게되므로 위험합니다. 목록에 항목을 추가 한 다음 브라우저를 닫은 다음 웹 사이트를 다시 실행하고 장바구니에 항목을 추가하지만 브라우저를 다시 열기 전에 추가 한 항목이 계속 표시됩니다. 이전에 웹 응용 프로그램을 사용하고 비슷한 코드를 사용했을 때 이런 일이 발생하지 않았습니다. 이 문제를 해결할 방법이 있습니까? 클라이언트 측에 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

[mcve]가 도움이됩니다. 이것은 너무 많은 원인이 될 수 있습니다. –

+0

일부 코드를 제공 할 수 있다면 문제가있는 곳을 확인하는 데 도움이 될 것입니다. – MichaelDotKnox

+0

@ DanielA.White 코드를 추가했으며 최소, 완전하며 검증 가능한 예제 표준에 맞기를 바랍니다. 한번 봐주세요. –

답변

0

당신의 문제는 당신이 가진 정적 클래스의 결과라고 생각합니다. 이것은 올바르게 수행되지 않으면 웹 환경에서 매우 위험 할 수 있습니다. 정적 클래스를 사용하면 하나의 세션이 다른 세션에서 사용되는 정적 속성이나 변수에 값을 설정하는 경쟁 조건이 매우 쉽습니다.

제 생각에는 정적 클래스와 정적 메서드를 정적이 아닌 클래스와 메서드로 변경하는 것을 리팩토링하는 것이 좋습니다. 그러면 문제가 사라질 가능성이 큽니다.

희망이 있습니다.

관련 문제