2010-11-26 5 views
1

Je suis tout nouveau à asp, donc je pense que la réponse à cette question devrait être facile, mais je ne peux pas comprendre ce que je fais mal. Ceci est un exercice de panier très simple que je fais pour apprendre ASP. Je crée la session, ajoute des choses, puis sur la page de paiement devrait être en mesure de retirer des éléments du panier un par un. Si je clique sur Supprimer, l'élément est supprimé de la liste, mais pas de la session. Je sais qu'il persiste dans la session parce que si je clique sur le lien vers la page d'achat, la zone de liste sur la page d'achat va remplir avec l'élément que j'ai pensé que j'ai retiré.Suppression d'un dictionnaireentry d'un index de session (ASP)

J'ai essayé de le supprimer de deux manières différentes, et je ne sais pas pourquoi cela ne fonctionne pas.

note: Les clés de dictionnaire sont les noms réels des produits utilisés pour remplir les zones de liste. L'entrée de valeur est le # productID que je n'utilise pas actuellement. La zone de liste sur la page d'achat est remplie avec des données provenant d'une source sqlsource. SelectedItem.Text = nom du produit (affiché) et SelectedValue = productID (non utilisé).

Merci beaucoup pour votre aide

//Default (shopping) page 
    protected void Page_Load(object sender, EventArgs e) 
    { 
     if (!IsPostBack) 
     { 
      //Create a new collection for the session indexer 
      ArrayList cart = (ArrayList)Session["scart"]; 

      //Need to initialize a new object in case it's null 
      if (cart == null) 
      { 
       cart = new ArrayList(); 
       Session["scart"] = cart; 
      } 

      //Show the shopping car listbox if there are items in it and the 
      //user returned from the checkout page 
      else pnlItems.Visible = true; 
      foreach (DictionaryEntry item in cart) 
      { 
       lbItems.Items.Add((string)item.Key); 
      } 
     } 
     //Show the shipping cart listbox containing the items the user just added 
     if (IsPostBack) pnlItems.Visible = true; 
    } 
    private void add_to_cart(string item, int value) 
    { 
     //Method to add the selected item to the collection/session indexer 
     ArrayList cart = (ArrayList)Session["scart"]; 
     cart.Add(new DictionaryEntry(item, value)); 
    } 
    protected void btnAddItem_Click(object sender, EventArgs e) 
    { 
     //Method to send the selected item to the add_to_cart method 
     string item = ddlProducts.SelectedItem.Text; 
     lbItems.Items.Add(item); 
     int value = int.Parse(ddlProducts.SelectedValue); 
     add_to_cart(item, value); 
    } 
    protected void ddlProducts_SelectedIndexChanged(object sender, EventArgs e) 
    { 

    } 

    protected void btnCheckOut_Click(object sender, EventArgs e) 
    { 
     //Send the user to the checkout page when the button is clicked 
     Response.Redirect("checkout.aspx", true); 
    } 

} 

//CheckoutPage: 
    protected void Page_Load(object sender, EventArgs e) 
    { 
     if (!IsPostBack) 
     { 
      //Populate the shopping cart on the checkout page with the items in the collection 
      ArrayList cart = (ArrayList)Session["scart"]; 
      foreach (DictionaryEntry item in cart) 
      { 
       lbCheckOut.Items.Add((string)item.Key); 
      } 
     } 
    } 
    protected void btnKillOrder_Click(object sender, EventArgs e) 
    { 
     //Kills the order by ending the session, then returns the user to the shopping page. 
     Session.Clear(); 
     Response.Redirect("Default.aspx", true); 
    } 
    protected void btnRemove_Click(object sender, EventArgs e) 
    { 
     //Removes the selected item from the shopping cart listbox and the session indexer 
     ArrayList cart = (ArrayList)Session["scart"]; 
     cart.Remove(lbCheckOut.SelectedItem.Text); 
     lbCheckOut.Items.Remove(lbCheckOut.SelectedItem.Text); 
     Session["scart"] = cart; 
     //Session.Remove(lbCheckOut.SelectedItem.Text); 
    } 
} 

Répondre

0

Vous êtes en effet d'ajouter DictionaryEntry cas à l'état de session:

private void add_to_cart(string item, int value) 
{ 
    ArrayList cart = (ArrayList)Session["scart"]; 
    cart.Add(new DictionaryEntry(item, value)); 
} 

Mais vous essayez de supprimer des chaînes par la suite, qui ne peuvent pas travailler: Vous devez rechercher le DictionaryEntry votre chaîne et de supprimer cette entrée à la place:

protected void btnRemove_Click(object sender, EventArgs e) 
{ 
    ArrayList cart = (ArrayList) Session["scart"]; 
    foreach (DictionaryEntry item in cart) { 
     if ((string) item.Key == lbCheckOut.SelectedItem.Text) { 
      cart.Remove(item); 
      break; 
     } 
    } 
} 
+0

Merci, cela a fonctionné! J'avais déjà essayé quelque chose de similaire mais j'ai eu une erreur d'énumérateur dans la déclaration foreach. Ne sachant pas comment le déboguer proprement, j'ai abandonné et essayé la méthode que j'ai posée ci-dessus. En tout cas, merci! –

0

Le problème est que votre objet Session contient un ArrayList d'instances DictionaryEntry. Ainsi, cart.Remove(lbCheckOut.SelectedItem.Text) essaie de comparer le texte à une instance de DictionaryEntry et renvoie false à chaque fois. Il serait plus simple si vous mettez une véritable instance de dictionnaire dans Session au lieu d'une ArrayList:

if (cart == null) 
{ 
    cart = new Dictionary<string,int>(); 
    Session["scart"] = cart; 
} 
... 

var cart = (Dictionary<string,int>)Session["scart"]; 
cart.Remove(lbCheckOut.SelectedItem.Text); 
Questions connexes