I would like to make a simple Cart, where I used as a basis some explanations here inside the same Stack. Here is my Shopping Cart Controller:
public class CarrinhoController : Controller
{
private Context db = new Context();
public ActionResult AdicionarCarrinho(int id)
{
Pedido carrinho = Session["Carrinho"] != null ? (Pedido)Session["Carrinho"] : new Pedido();
var produto = db.Produtos.Find(id);
if (produto != null)
{
var itemPedido = new ItemPedido();
itemPedido.ItemPedidoID = Guid.NewGuid();
itemPedido.Produto = produto;
itemPedido.Qtd = 1;
if (carrinho.ItensPedido.FirstOrDefault(p => p.ProdutoID == produto.ProdutoID) != null)
{
carrinho.ItensPedido.FirstOrDefault(p => p.ProdutoID == produto.ProdutoID).Qtd += 1;
}
else
{
carrinho.ItensPedido.Add(itemPedido);
}
carrinho.ValorTotal = carrinho.ItensPedido.Select(i => i.Produto).Sum(d => d.Valor);
Session["Carrinho"] = carrinho;
}
return RedirectToAction("Carrinho");
}
public ActionResult Carrinho()
{
Pedido carrinho = Session["Carrinho"] != null ? (Pedido)Session["Carrinho"] : new Pedido();
return View(carrinho);
}
public ActionResult ExcluirItem(Guid id)
{
var carrinho = Session["Carrinho"] != null ? (Pedido)Session["Carrinho"] : new Pedido();
var itemExclusao = carrinho.ItensPedido.FirstOrDefault(i => i.ItemPedidoID == id);
carrinho.ItensPedido.Remove(itemExclusao);
Session["Carrinho"] = carrinho;
return RedirectToAction("Carrinho");
}
public ActionResult SalvarCarrinho()
{
var carrinho = Session["Carrinho"] != null ? (Pedido)Session["Carrinho"] : new Pedido();
db.Pedidos.Add(carrinho);
db.SaveChanges();
return RedirectToAction("Carrinho");
}
}
Below are my classes being used:
public class ItemPedido
{
[Key]
public Guid ItemPedidoID { get; set; }
public int ProdutoID { get; set; }
public virtual Produto Produto { get; set; }
public int PedidoID { get; set; }
public virtual Pedido Pedido { get; set; }
public int Qtd { get; set; }
}
public class Produto
{
[Key]
public int ProdutoID { get; set; }
[Required(ErrorMessage = "Preencha o nome do produto")]
[DisplayName("Produto")]
[StringLength(20, MinimumLength = 5, ErrorMessage = "O nome do produto deve ter entre 5 a 20 caracteres")]
public string Nome { get; set; }
[Required(ErrorMessage = "Preencha a descrição do produto")]
[DisplayName("Descrição")]
[StringLength(50, MinimumLength = 5, ErrorMessage = "O nome do produto deve ter entre 5 a 50 caracteres")]
public string Descricao { get; set; }
[DisplayName("Foto")]
public string Foto { get; set; }
[Required(ErrorMessage = "Preencha o valor do produto")]
[DisplayName("Valor R$")]
public decimal Valor { get; set; }
//relacionamentos
public int RestauranteID { get; set; }
public virtual Restaurante Restaurante { get; set; }
public virtual ICollection<ItemPedido> ItensPedido { get; set; }
}
public class Pedido
{
public int PedidoID { get; set; }
public DateTime DtPedido { get; set; }
public int UsuarioID { get; set; }
public virtual Usuario Usuario { get; set; }
public Decimal Valor { get; set; }
public Decimal ValorTotal { get; set; }
public virtual ICollection<ItemPedido> ItensPedido { get; set; }
}
Below is the only View I made, based on previous explanations:
@model FoodInTime.Models.Pedido
@{
ViewBag.Title = "Carrinho";
Layout = "~/Views/Shared/_LayoutCliente.cshtml";
}
<h2>Carrinho</h2>
@foreach (var item in Model.ItensPedido)
{
<li>
@item.ProdutoID - @item.Produto.Nome
<input type="text" value="@item.Qtd" readonly="readonly" />
<input type="submit" value="alterar" />
@Html.ActionLink("Remover", "ExcluirItem", new { id = item.ProdutoID }, null)
</li>
}
@Html.ActionLink("Retornar", "Cardapio", "Restaurantes")
What I want is to know where I click to add a Product that is on my Menu and it enters this Cart View. Or would it be a View that adds the items to the Cart because it's an Action? Sorry for ignorance, I'm really not good with programming. My Menu is a Products List.