Criando um Carrinho de Compras Simples utilizando ASP.NET e Cookies

Postado por Daniel Garcia às 18:57 QUINTA-FEIRA, 6 DE AGOSTO DE 2009

Neste post mostrarei como criar um carrinho de compras simples para seu site de e-commerce, utilizando ASP.NET e Cookies, dispensando a utilização de banco de dados.

Optei por utilizar cookies ao invés do banco de dados para armazenamento no carrinho, em função da performance e também porque o carrinho de compras normalmente é utilizado para armazenamento temporário dos produtos.

Neste exemplo utilizarei o banco de dados Northwind. Se você não tiver um banco de dados poderá baixar o Nothwind.

Para desenvolver a aplicação utilizarei o Visual Studio 2008 Professional, porém você poderá utilizar o Visual Web Developer 2008 Express Edition, disponibilizado gratuitamente pela Microsoft em: http://www.microsoft.com/express/.

Seguirei os seguintes passos para criação do carrinho de compras:

1 – Abra o Visual Studio.

2 – Crie um webform chamado Produtos.aspx. Neste webform carregarei os produtos do banco de dados Northwind, para que posteriormente possamos adicioná-los ao carrinho de compras.

A seguir, o screenshot da página Produtos.aspx:


Lista de Produtos

Veja parte do código da página Produtos.aspx:

<div>
   
<b>Produtos</b><br /><br
/>
   
<asp:GridView ID="gvwProdutos" runat="server" AutoGenerateColumns="False" onrowcommand
="gvwProdutos_RowCommand">
       
<Columns
>
           
<asp:BoundField DataField="ProductID" HeaderText="ID"
/>
           
<asp:BoundField DataField="ProductName" HeaderText="Nome"
/>
           
<asp:TemplateField
>
               
<ItemTemplate
>
                   
<asp:LinkButton ID="lbtnAdicionar" runat="server" CommandArgument='<%# Eval("ProductID") %>' 
                                          CommandName="Adicionar">Adicionar ao Carrinho</asp:LinkButton
>
               
</ItemTemplate
>
            
</asp:TemplateField
>
        
</Columns
>
   
</asp:GridView
>
   
<p><a href="Carrinho.aspx">Meu Carrinho</a></p
>
</div>

Veja a implementação da rotina de carregamento da grid de produtos e da rotina que adiciona os produtos no carrinho de compras:

using System;
using System.Collections.Generic;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Data;
using System.Data.SqlClient;

public partial class Produtos : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        if (!Page.IsPostBack)
            this.CarregarProdutos();
    }

    // Este evento é executado quando clicar em "Adicionar ao Carrinho"
    protected void gvwProdutos_RowCommand(object sender, GridViewCommandEventArgs e)
    {
        if (e.CommandName == "Adicionar")
        {
            // Verifica o id do produto
            string idProduto = e.CommandArgument.ToString();
            // Adiciona o produto ao carrinho de compras
            this.AdicionarAoCarrinho(idProduto);
            // Redireciona para página Carrinho.aspx
            Response.Redirect("Carrinho.aspx");
        }
    }

    // Carrega a grid com a listagem de produtos
    private void CarregarProdutos()
    {
        SqlConnection conexao = new SqlConnection("[STRING_DE_CONEXÃO]");
        SqlCommand comando = new SqlCommand("select ProductID, ProductName from products where supplierid = 2");
        SqlDataAdapter da = new SqlDataAdapter();
        DataSet ds = new DataSet();

        comando.Connection = conexao;

        da.SelectCommand = comando;
        da.Fill(ds);

        gvwProdutos.DataSource = ds;
        gvwProdutos.DataBind();
    }

    // Adiciona o Produto ao Carrinho
    private void AdicionarAoCarrinho(string idProduto)
    {
        HttpCookie cookie;

        // Se o cookie não existe, efetuamos sua criação
        if (Request.Cookies["Carrinho"] == null)
        {
            cookie = new HttpCookie("Carrinho");
            // Configura a expiração do Cookie para 4 horas
            cookie.Expires = DateTime.Now.AddHours(4);
            // Adiciona item ao cookie
            cookie.Values.Add(idProduto, null);
        }
        // Caso o cookie já exista
        else
        {
            bool existe = false;
            // Resgata o cookie
            cookie = (HttpCookie)Request.Cookies["Carrinho"];
            // Configura a expiração do Cookie para 4 horas
            cookie.Expires = DateTime.Now.AddHours(4);

            // Verifica se o ID do produto já foi inserido ao cookie
            foreach (string item in cookie.Values.AllKeys)
            {
                if (item == idProduto)
                {
                    existe = true;
                    break;
                }
            }

            // Se o produto não existir no carrinho ser adicionado
            if (!existe)
                cookie.Values.Add(idProduto, null);
        }

        // Grava o cookie
        Response.Cookies.Add(cookie);
    }
} 

3 – Crie outro webform chamado Carrinho.aspx onde exibiremos os produtos adicionados ao carrinho. Serão armazenados os “IDs” dos produtos dentro dos cookies.

A seguir, o screenshot da página Carrinho.aspx:


Carrinho de Compras

Veja parte do código da página Carrinho.aspx:

<div>
   
<b>Carrinho de Compras</b><br
/>
   
<br
/>
   
<asp:GridView ID="gvwCarrinho" runat="server" AutoGenerateColumns="False" OnRowCommand
="gvwCarrinho_RowCommand">
       
<Columns
>
           
<asp:BoundField DataField="ProductID" HeaderText="ID"
/>
           
<asp:BoundField DataField="ProductName" HeaderText="Nome"
/>
           
<asp:TemplateField
>
               
<ItemTemplate
>
                   
<asp:LinkButton ID="lbtnRemover" runat="server" CommandArgument='<%# Eval("ProductID") %>
'
                                          
CommandName="Remover">Remover Produto</asp:LinkButton
>
               
</ItemTemplate
>
           
</asp:TemplateField
>
       
</Columns
>
        <EmptyDataTemplate
>
           
O carrinho está vazio!
        </EmptyDataTemplate
>
   
</asp:GridView
>
   
<p><a href="Produtos.aspx">Continuar Comprando</a></p
>
</div>

Veja a implementação da rotina que exibe os produtos adicionados ao carrinho de compras e a rotina que remove os produtos do carrinho: 

using System;
using System.Collections.Generic;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Data;
using System.Data.SqlClient;

public partial class Carrinho : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        if (!Page.IsPostBack)
            this.CarregarCarrinho();
    }

     // Este evento é executado quando clicar em "Adicionar ao Carrinho"
    protected void gvwCarrinho_RowCommand(object sender, GridViewCommandEventArgs e)
    {
        if (e.CommandName == "Remover")
        {
            // Verifica o id do produto
            string idProduto = e.CommandArgument.ToString();
            // Remove porduto do carrinho
            this.RemoverDoCarrinho(idProduto);
            this.CarregarCarrinho();
        }
    }

    // Carrega a grid com os produtos do carrinho
    private void CarregarCarrinho()
    {
        // Recupera os ids dos produtos do cookie
        string produtos = this.RecuperarIDProdutos();
        SqlConnection conexao = new SqlConnection("[STRING_DE_CONEXÃO]");
        SqlCommand comando = new SqlCommand();
        SqlDataAdapter da = new SqlDataAdapter();
        DataSet ds = new DataSet();

        comando.Connection = conexao;

        if (!string.IsNullOrEmpty(produtos))
        {
            comando.CommandText = "select ProductID, ProductName from products where supplierid = 2 and ProductID in (" + produtos + ")";

            da.SelectCommand = comando;
            da.Fill(ds);

            gvwCarrinho.DataSource = ds;

        }

        gvwCarrinho.DataBind();

    }

    // Remove porduto do carrinho
    private string RecuperarIDProdutos()
    {
        string ids = null;
        int index = 1;

        // Resgata o cookie
        HttpCookie cookie = (HttpCookie)Request.Cookies["Carrinho"];

        // Verifica se o ID do produto já foi inserido ao cookie
        foreach (string item in cookie.Values.AllKeys)
        {
            ids += item;

            if (index < cookie.Values.Count)
                ids += ",";

            index += 1;
        }

        return ids;
    }

    private void RemoverDoCarrinho(string idProduto)
    {
        // Resgata o cookie
        HttpCookie cookie = (HttpCookie)Request.Cookies["Carrinho"];
        // Configura a expiração do Cookie para 4 horas
        cookie.Expires = DateTime.Now.AddHours(4);
        // Remove o id do produto do cookie
        cookie.Values.Remove(idProduto);
        // Grava o cookie

        Response.Cookies.Add(cookie);
    }
} 

Conclusão 

Este é um exemplo básico da criação de um carrinho de compras em ASP.NET. Use a sua criatividade e explore novos recursos e funcionalidades.

Espero que aproveitem esta dica!

3.3 ponto(s). Avaliado por 4 pessoas

  • Currently 3,25/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5

Tags: ,

ASP.NET | E-Commerce

Calculando o Valor do SEDEX com ASP.NET

Postado por Daniel Garcia às 11:37 SÁBADO, 11 DE JULHO DE 2009

Neste post mostrarei um dica que é muito útil principalmente para quem está desenvolvendo um site de e-commerce, o cálculo do valor de envio via SEDEX dos Correios.

Os Correios disponibiliza em seu site uma URL que efetua o calculo prá você. Vou demostrar como implementamos isso dentro do ASP.NET.

Para isso seguiremos os seguintes passos:

1 - Crie um formulário com os seguintes campos: "Serviço", "CEP de Origem", "CEP Destino", "Peso", "Em Mãos", "Valor Declarado" e "Aviso de Recebimento".

A seguir, o Código do formulário:
       ...
      <table cellpadding="0" cellspacing="0">
            <tr>
                  <td>Serviço:&nbsp;&nbsp;</td>
                  <td>
                        <asp:DropDownList ID="ddlServico" runat="server">
                              <asp:ListItem Value="40010">SEDEX</asp:ListItem>
                              <asp:ListItem Value="40215">SEDEX 10</asp:ListItem>
                        </asp:DropDownList>
                  </td>
            </tr>
            <tr>
                  <td>CEP de Origem:&nbsp;&nbsp;</td>
                  <td><asp:TextBox ID="txtCEPOrigem" runat="server"></asp:TextBox></td>
            </tr>
            <tr>
                  <td>CEP de Destino:&nbsp;&nbsp;</td>
                  <td><asp:TextBox ID="txtCEPDesino" runat="server"></asp:TextBox></td>
            </tr>
            <tr>
                  <td>Peso:&nbsp;&nbsp;</td>
                  <td><asp:TextBox ID="txtPeso" runat="server" Width="80px"></asp:TextBox></td>
            </tr>
            <tr>
                  <td>Em Mãos:&nbsp;&nbsp;</td>
                  <td>
                        <asp:DropDownList ID="ddlEmMaos" runat="server">
                              <asp:ListItem Value="s">Sim</asp:ListItem>
                              <asp:ListItem Value="n">Não</asp:ListItem>
                        </asp:DropDownList>
                  </td>
            </tr>
            <tr>
                  <td>Valor Declarado:&nbsp;&nbsp;</td>
                  <td><asp:TextBox ID="txtValorDeclarado" runat="server"></asp:TextBox></td>
            </tr>
            <tr>
                  <td>Aviso Recebimento:&nbsp;&nbsp;</td>
                  <td>
                        <asp:DropDownList ID="ddlAvisoRecebimento" runat="server">
                              <asp:ListItem Value="s">Sim</asp:ListItem>
                              <asp:ListItem Value="n">Não</asp:ListItem>
                        </asp:DropDownList>
                  </td>
            </tr>
            <tr>
                  <td>&nbsp;</td>
                  <td>&nbsp;</td>
            </tr>
            <tr>
                  <td>&nbsp;</td>
                  <td style="margin-left: 40px">
                        <asp:Button ID="btnCalcular" runat="server" Text="Calcular" onclick="btnCalcular_Click" style="height: 26px" />
                  </td>
            </tr>
            <tr>
                  <td>&nbsp;</td>
                  <td>&nbsp;</td>
            </tr>
            <tr>
                  <td colspan="2">
                        <asp:Label ID="lblValor" runat="server" style="text-align: center"></asp:Label>
                  </td>
            </tr>
      </table>
       ...

* Observe os valores de cada ListItem dos DropDowLists "ddlServico", "ddlMaoPropria" e "ddlAvisoRecebimento". Eles devem permanecer os mesmo para que a consulta ocorra corretamente.

2 - Implemente o evento Click do botão "btnCalcular".

protected void btnCalcular_Click(object sender, EventArgs e)
{
        try
        {
               HttpWebRequest req;
               HttpWebResponse resp; 
               DataSet ds; 
               StreamReader sr;
// 1 - Atribui os valores dos campos a variáveis
string servico = ddlServico.SelectedValue;
string cepOrigem = txtCEPOrigem.Text;
string cepDestino = txtCEPDesino.Text;
string peso = txtPeso.Text;
string maopropria = ddlEmMaos.SelectedValue;
string avisorecebimento = ddlAvisoRecebimento.SelectedValue;

// 2 - Faz uma requisição a URL passando os valores selecionados via QueryString (resposta em XML)
req = (HttpWebRequest)WebRequest.Create("http://www.correios.com.br/encomendas/precos/calculo.cfm?" +
                                                            "Servico=" + servico + "&cepOrigem=" + cepOrigem + "&cepDestino=" + cepDestino +
                                                            "&peso=" + peso.Replace(",", ".") + "&MaoPropria=" + maopropria + 
                                                            "&AvisoRecebimento=" + avisorecebimento + "&resposta=xml");

// 3 - Armazena a resposta da requisição
resp = (HttpWebResponse)req.GetResponse();

// 4 - Converte a resposta (XML) da requisição para um StreamReader
sr = new StreamReader(resp.GetResponseStream(), System.Text.Encoding.UTF8); ds = new DataSet();

// 5 - Lê o StreamReader (XML) e carrega em um DataSet
ds.ReadXml(sr);

sr.Close();
resp.Close();

// 6 - Verifica se a consulta retornou erro
if (Convert.ToInt32(ds.Tables["erro"].Rows[0]["codigo"]) != 0)
{
      throw new Exception(ds.Tables["erro"].Rows[0]["descricao"].ToString());
}
// 7 - Caso a Consulta não tenha retornado erro, carrega o resultado no Label
else
{
      lblValor.Text = ds.Tables["Dados_Postais"].Rows[0]["preco_postal"].ToString().Replace(".", ",");
}

}
catch (Exception ex)

        lblValor.Text = ex.Message;
}

}

3 - Finalmente, está pronto. Ao clicar no botão "Calcular" o resultado será esse:

E ai, gostaram? Espero que esta dica seja útil prá vocês!

5.0 ponto(s). Avaliado por 2 pessoas

  • Currently 5/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5

Tags: , ,

ASP.NET | C# | E-Commerce

Sobre o Autor

Daniel Garcia - MCP, MCTS, MCPD
Meu nome é Daniel Garcia, venho atuando no mercado de tecnologia há mais de uma década. Durante esse tempo tive a oportunidade de trabalhar com diversas tecnologias, principalmente Microsoft. Conquistei os títulos: MCP, MCTS, MCDP e MCT. Desde então, venho contribuindo com toda a Comunidade, divulgando meu conhecimento das tecnologias Microsoft.