none
Session carrinho de compras. RRS feed

  • Pergunta

  • Bom dia pessoal, estou com uma dúvida a respeito de uma session que eu utilizo para adicionar produtos ao carrinho de compras.

    Como eu faria para armazenar todos os produtos na session pois sempre fica o ultimo produto adicionado.

    Essa é minha Action:

     public ActionResult Carrinho(int id)
            {
                         
                Session["Carrinho"] = produtoDAO.retornaProduto(id);
                //List<Object> prod = (List<Object>)HttpContext.Session["Carrinho"];
    
                return RedirectToAction("Index");
            }

    terça-feira, 12 de maio de 2015 12:23

Respostas

  • Raniel,

    Pelo seu código, esse método, retorna apenas um produto.

    produtoDAO.retornaProduto(id);

     

    Utilizando esse mesmo código vc poderia fazer assim:

     public ActionResult Carrinho(int id)
            {
                //No login vc terá que botar esse código aqui      
                //Session["Carrinho"] = new List<Produto>();
    
                //Com o carrinho criado como lista basta vc acessar e inserir os produtos
                ((List<Produto>)Session["Carrinho"]).Add(produtoDAO.retornaProduto(id));
                 
    
                //List<Object> prod = (List<Object>)HttpContext.Session["Carrinho"];
    
                return RedirectToAction("Index");
            }


    Att. Andre de Mattos Ferraz

    • Marcado como Resposta Raniel Nogueira terça-feira, 12 de maio de 2015 14:47
    terça-feira, 12 de maio de 2015 12:30

Todas as Respostas

  • Raniel,

    Pelo seu código, esse método, retorna apenas um produto.

    produtoDAO.retornaProduto(id);

     

    Utilizando esse mesmo código vc poderia fazer assim:

     public ActionResult Carrinho(int id)
            {
                //No login vc terá que botar esse código aqui      
                //Session["Carrinho"] = new List<Produto>();
    
                //Com o carrinho criado como lista basta vc acessar e inserir os produtos
                ((List<Produto>)Session["Carrinho"]).Add(produtoDAO.retornaProduto(id));
                 
    
                //List<Object> prod = (List<Object>)HttpContext.Session["Carrinho"];
    
                return RedirectToAction("Index");
            }


    Att. Andre de Mattos Ferraz

    • Marcado como Resposta Raniel Nogueira terça-feira, 12 de maio de 2015 14:47
    terça-feira, 12 de maio de 2015 12:30
  • Raniel,

    Vc precisa armazenar uma lista de instâncias de Produto, ao invés de uma única referência deste tipo de objeto (estou imaginando que vc possui uma classe chamada Produto):

    public ActionResult Carrinho(int id)
    {
        List<Produto> carrinho = (List<Produto>)(Session["Carrinho"]);
        if (carrinho == null)
        {
             List<Produto> carrinho = new List<Produto>();
             Session["Carrinho"] = carrinho;
        }
    
        carrinho.Add(produtoDAO.retornaProduto(id));
    
        return RedirectToAction("Index");
    }

    terça-feira, 12 de maio de 2015 12:32
  • Raniel,

    Pelo seu código, esse método, retorna apenas um produto.

    produtoDAO.retornaProduto(id);

     

    Utilizando esse mesmo código vc poderia fazer assim:

     public ActionResult Carrinho(int id)
            {
                //No login vc terá que botar esse código aqui      
                //Session["Carrinho"] = new List<Produto>();
    
                //Com o carrinho criado como lista basta vc acessar e inserir os produtos
                ((List<Produto>)Session["Carrinho"]).Add(produtoDAO.retornaProduto(id));
                 
    
                //List<Object> prod = (List<Object>)HttpContext.Session["Carrinho"];
    
                return RedirectToAction("Index");
            }


    Att. Andre de Mattos Ferraz


    Vou testar amigo.
    terça-feira, 12 de maio de 2015 12:42
  • Raniel,

    Vc precisa armazenar uma lista de instâncias de Produto, ao invés de uma única referência deste tipo de objeto (estou imaginando que vc possui uma classe chamada Produto):

    public ActionResult Carrinho(int id)
    {
        List<Produto> carrinho = (List<Produto>)(Session["Carrinho"]);
        if (carrinho == null)
        {
             List<Produto> carrinho = new List<Produto>();
             Session["Carrinho"] = carrinho;
        }
    
        carrinho.Add(produtoDAO.retornaProduto(id));
    
        return RedirectToAction("Index");
    }


    Vou testar da sua maneira também Renato.
    terça-feira, 12 de maio de 2015 12:42
  • Raniel,

    Pelo seu código, esse método, retorna apenas um produto.

    produtoDAO.retornaProduto(id);

     

    Utilizando esse mesmo código vc poderia fazer assim:

     public ActionResult Carrinho(int id)
            {
                //No login vc terá que botar esse código aqui      
                //Session["Carrinho"] = new List<Produto>();
    
                //Com o carrinho criado como lista basta vc acessar e inserir os produtos
                ((List<Produto>)Session["Carrinho"]).Add(produtoDAO.retornaProduto(id));
                 
    
                //List<Object> prod = (List<Object>)HttpContext.Session["Carrinho"];
    
                return RedirectToAction("Index");
            }


    Att. Andre de Mattos Ferraz

    Amigo ocorreu o seguinte erro.

    terça-feira, 12 de maio de 2015 12:52
  • Vi aqui que você comentou a linha da criação da Session no login, mais se por exemplo eu quiser o cliente faça a inclusão do produto e depois faça o login?
    terça-feira, 12 de maio de 2015 12:56
  • Bom dia Raniel,

    Nesse caso eu salvaria todos os itens em uma lista e, após isso, enviaria o conteúdo da lista para uma sessão.

    Para salvar o conteúdo na lista, você pode fazer da seguinte maneira.

    // Criação da lista baseada na classe ObjCarrinhoModel.
    List<ObjCarrinhoModel> listaCarrinho = new List<ObjCarrinhoModel>();
    
    // Adiciona o retorno da consulta na lista.
    listaCarrinho.Add(produtoDAO.retornaProduto(id));
    
    // Envia o conteúdo da lista para a sessão.
    Session["Carrinho"] = listaCarrinho;
    
    

    Para recuperar o conteúdo da sessão para a lista, você pode fazer da seguinte maneira.

    // Criação da lista baseada na classe ObjCarrinhoModel.
    List<ObjCarrinhoModel> listaRetornoCarrinho =  new List<ObjCarrinhoModel>();
    
    // Recupera o conteúdo da sessão para a lista.
    listaRetornoCarrinho  = (List<ObjCarrinhoModel>) Session["Carrinho"];

    Abs.

    Bruno Destro


    Dicas de programação em .net, C# e SQL - http://smcode.com.br/blog.aspx

    terça-feira, 12 de maio de 2015 12:58
  • Bom dia Raniel,

    Nesse caso eu salvaria todos os itens em uma lista e, após isso, enviaria o conteúdo da lista para uma sessão.

    Para salvar o conteúdo na lista, você pode fazer da seguinte maneira.

    // Criação da lista baseada na classe ObjCarrinhoModel.
    List<ObjCarrinhoModel> listaCarrinho = new List<ObjCarrinhoModel>();
    
    // Adiciona o retorno da consulta na lista.
    listaCarrinho.Add(produtoDAO.retornaProduto(id));
    
    // Envia o conteúdo da lista para a sessão.
    Session["Carrinho"] = listaCarrinho;
    

    Para recuperar o conteúdo da sessão para a lista, você pode fazer da seguinte maneira.

    // Criação da lista baseada na classe ObjCarrinhoModel.
    List<ObjCarrinhoModel> listaRetornoCarrinho =  new List<ObjCarrinhoModel>();
    
    // Recupera o conteúdo da sessão para a lista.
    listaRetornoCarrinho  = (List<ObjCarrinhoModel>) Session["Carrinho"];

    Abs.

    Bruno Destro


    Dicas de programação em .net, C# e SQL - http://smcode.com.br/blog.aspx


    Bruno me tira uma dúvida, caso o Cliente atualize a pagina não vai limpar recriar a lista?
    terça-feira, 12 de maio de 2015 13:02
  • Se ele sobrescrever o dado da session sim. Por isso sugeri que no login vc iniciasse a lista do carrinho na session. Ou você pode fazer da forma que o Renato colocou.

    List<Produto> carrinho = (List<Produto>)(Session["Carrinho"]);
        if (carrinho == null)
        {
             List<Produto> carrinho = new List<Produto>();
             Session["Carrinho"] = carrinho;
        }
    ...


    Att. Andre de Mattos Ferraz

    terça-feira, 12 de maio de 2015 13:43
  • Fiz da sua maneira André mais a lista volta vazia no Foreach, nem entra dentro do laço de repetição.
      @if(Session["Carrinho"] != null)
                                { 
                                    foreach(var c in ((List<Lepidus.Models.Produto>)Session["Carrinho"]))
                                    { 
                                <li>
                                    <div class="basket-item">
                                        <div class="row">
                                            <div class="col-xs-4 col-sm-4 no-margin text-center">
                                                <div class="thumb">
                                                    <img alt="" src="~/Content/assets/images/products/product-small-01.jpg" />
                                                </div>
                                            </div>
                                            <div class="col-xs-8 col-sm-8 no-margin">
                                                <div class="title">@c.Nome</div>
                                                <div class="price">@String.Format("{0:C}",c.Preco)</div>
                                            </div>
                                        </div>
                                        <a class="close-btn" href="#"></a>
                                    </div>
                                </li>
                                }
                                }


    terça-feira, 12 de maio de 2015 14:38
  • Fiz da sua maneira André mais a lista volta vazia no Foreach, nem entra dentro do laço de repetição.
      @if(Session["Carrinho"] != null)
                                { 
                                    foreach(var c in ((List<Lepidus.Models.Produto>)Session["Carrinho"]))
                                    { 
                                <li>
                                    <div class="basket-item">
                                        <div class="row">
                                            <div class="col-xs-4 col-sm-4 no-margin text-center">
                                                <div class="thumb">
                                                    <img alt="" src="~/Content/assets/images/products/product-small-01.jpg" />
                                                </div>
                                            </div>
                                            <div class="col-xs-8 col-sm-8 no-margin">
                                                <div class="title">@c.Nome</div>
                                                <div class="price">@String.Format("{0:C}",c.Preco)</div>
                                            </div>
                                        </div>
                                        <a class="close-btn" href="#"></a>
                                    </div>
                                </li>
                                }
                                }



    Deu certo vlw amigo!

    terça-feira, 12 de maio de 2015 14:47
  • Raniel,

    Tente fazer da forma sugeri. Creio que resolverá o problema.

    terça-feira, 12 de maio de 2015 14:47
  • Raniel,

    Isso mesmo, limpará a lista, porém armazenando e recuperando a lista na sessão você não terá esse problema. No evento "click" do botão para adicionar o produto no carrinho, você recupera o conteúdo da sessão para a lista, adiciona o produto selecionado para a lista e envia o conteúdo novamente para a sessão.

    Abs.

    Bruno Destro


    Dicas de programação em .net, C# e SQL - http://smcode.com.br/blog.aspx

    quarta-feira, 13 de maio de 2015 00:54