Save Request - ASP.NET MVC

1

I want to make simple ecommerce on my website based on this question: Implementation of Cart Shopping in ASP.NET MVC

However, I am in doubt when doing two things: 1st Save the data in the Order table and OrderData, with some data coming from the session cart. 2º How to remove items from the cart? To add, everything is fine, but I can not remove it.

As I said, I'm doing according to the link above, so my code is pretty much the same. They follow:

public ActionResult AdicionarCarrinho(int id)
{

    Pedido carrinho = Session["Carrinho"] != null ? (Pedido)Session["Carrinho"] : new Pedido();

    var produto= db.Produto.Find(id);

    if produto!= null)
    {
        var itemPedido= new ItemPedido();
        itemPedido.Produto = produto;
        itemPedido.Qtd = 1;

        if (carrinho.ItemPedido.FirstOrDefault(p => p.IdProduto== produto.IdProduto) != null)
        {
            carrinho.ItemPedido.FirstOrDefault(p => p.IdProduto== produto.IdProduto).Qtd += 1;
        }

        else
        {
            carrinho.ItemPedido.Add(itemPedido);
        }



        carrinho.ValorTotal = carrinho.ItemPedido.Select(i => i.Produto).Sum(d => d.Preco);

        Session["Carrinho"] = carrinho;
    }

    return RedirectToAction("Carrinho");
}

public ActionResult Carrinho()
{
    Pedido carrinho = Session["Carrinho"] != null ? (Pedido)Session["Carrinho"] : new Pedido();

    return View(carrinho);
}

And the tables in the database:

Produto:
IdProduto
Nome
Preco

ItemPedido:
Id
IdProduto
IdPedido

Pedido:
IdPedido
DtPedido
StatusPedido
IdUsuario
DtPagamento
Valor
    
asked by anonymous 03.12.2014 / 13:14

1 answer

2

I'm assuming that when you display your cart, ItemPedido already has an Id filled out for you. That is, there would be a change here:

public ActionResult AdicionarCarrinho(int id)
{
    Pedido carrinho = Session["Carrinho"] != null ? (Pedido)Session["Carrinho"] : new Pedido();

    var produto= db.Produto.Find(id);

    if produto!= null)
    {
        var itemPedido= new ItemPedido();
        itemPedido.Id = // Coloque aqui um Id
        itemPedido.Produto = produto;
        itemPedido.Qtd = 1;
    }

    ...
}

I do not recommend using integer Ids in this part. Ideally it would be a generated Id (such as a Guid , for example. Microsoft has this structure that usage is transparent in ASP.NET MVC .

That is, your Model would look like this:

public class ItemPedido 
{
    [Key]
    public Guid ItemPedidoId { get; set; }
    public Guid ProdutoId { get; set; }
    public Guid PedidoId { get; set; }

    public virtual Produto Produto { get; set; }
    public virtual Pedido Pedido { get; set; }
}

And the Controller method:

public ActionResult AdicionarCarrinho(int id)
{

    Pedido carrinho = Session["Carrinho"] != null ? (Pedido)Session["Carrinho"] : new Pedido();

    var produto= db.Produto.Find(id);

    if produto!= null)
    {
        var itemPedido= new ItemPedido();
        itemPedido.Id = Guid.NewGuid();
        itemPedido.Produto = produto;
        itemPedido.Qtd = 1;
    }

    ...
}

To delete it now becomes simpler. Create another Action in Controller :

public ActionResult ExcluirItem(Guid id) 
{
    var carrinho = Session["Carrinho"] != null ? (Pedido)Session["Carrinho"] : new Pedido();
    var itemExclusao = carrinho.ItemPedido.FirstOrDefault(i => i.ItemPedidoId == id);
    carrinho.ItemPedido.Remove(itemExclusao);

    Session["Carrinho"] = carrinho;
    return RedirectToAction("Carrinho");
}

To save (I'm assuming at least Entity Framework 6 for this logic to work):

public ActionResult SalvarCarrinho() 
{
    var carrinho = Session["Carrinho"] != null ? (Pedido)Session["Carrinho"] : new Pedido();

    contexto.Pedidos.Add(carrinho);
    contexto.SaveChanges();

    return RedirectToAction("Carrinho");
}
    
03.12.2014 / 19:44