Question

Im using a repeater to display some products in an online shop for a school project. This is how the front end looks with the repeater

<asp:Repeater ID="Repeater1" runat="server"  OnItemCommand="rptList_ItemCommand">
    <ItemTemplate>
     <span style="float:left; padding:25px;" class="backgrnd">
      <asp:ImageButton ID="imgProd" runat="server" style="width:150px; height:150px;"    ImageUrl='<%# DataBinder.Eval(Container.DataItem, "productImg")%>' CommandArgument='<%# DataBinder.Eval(Container.DataItem, "productID")%>' CommandName="ViewIndividProd"/><br />
      <p style="clear:left;">
      <asp:Label ID="lbName" runat="server" Text='<%# DataBinder.Eval(Container.DataItem, "productName")%>' /><br />
      <asp:Label ID="lbUnitPrice" runat="server" Text='<%# DataBinder.Eval(Container.DataItem, "unitPrice")%>'/><br />
      <asp:Label ID="lbRatings" runat="server" Text=''>Ratings</asp:Label><br />
      <asp:LinkButton ID="linkCart" runat="server" CommandArgument='<%# DataBinder.Eval(Container.DataItem, "productID")%>' CommandName="AddToCart">Add to Cart</asp:LinkButton>
      </p>
    </span>
    </ItemTemplate>
</asp:Repeater>

As you can see I've added on the OnItemCommand in the Repeater tag so that this is invoked whenever one of the buttons(image/link) is fired. That works perfectly fine for both commandname AddToCart and ViewIndividProd. However, i want to store the the productid of a specific item that was invoked by the particular button. In my case now, it only stores ONE productid in the arraylist at a time and 'forgets' the productid that was stored previously when another linkbutton is clicked.

Question How do i make it such that everytime a linkbutton in the repeater is fired, it remembers the productid pertaining to the linkbutton that was fired and save these ids into the arraylist? This is how the back end looks

ArrayList cart = new ArrayList();
protected void rptList_ItemCommand(object sender, RepeaterCommandEventArgs e) {
    if (e.CommandName == "ViewIndividProd") {
        Session["productID"] = e.CommandArgument.ToString();
        Response.Redirect("IndividProduct.aspx");
    }
    if (e.CommandName == "AddToCart") {

        string prodid = e.CommandArgument.ToString();
        cart.Add(prodid);
        Session["ShoppingCart"] = cart;
        Response.Redirect("IndividCat.aspx");
    }
    msg.Text = "Shopping cart: " + String.Join(",", cart.ToArray());
}

Your feedback would be much appreciated.

Was it helpful?

Solution

You need to understand the Asp.net Page life cycle.

A new instance of your Page object is created on every request. Values from your input are populated into it.

Your array list is getting recreated every time. If you want the values to persist, you will have to store your arraylist in the ViewState or the Session

Refer: How to: Save Values in View State

  void Page_Load(object sender, EventArgs e)
  {
    if (ViewState["arrayListInViewState"] != null)
    {
      PageArrayList = (ArrayList)ViewState["arrayListInViewState"];
    }
    else
    {
      // ArrayList isn't in view state, so we need to create it from scratch.
      PageArrayList = CreateArray();
    }
    // Code that uses PageArrayList.
  }

OTHER TIPS

We can store comma separated or JSON value in either Session or hidden variable (If you are on the same page and opening new page in different tab then we can use hidden variable also). So every time an button has been click we can append the product id.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top