Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save rahiyansafz/d3a5f59891bc9c46e1659dda1fb355d9 to your computer and use it in GitHub Desktop.
Save rahiyansafz/d3a5f59891bc9c46e1659dda1fb355d9 to your computer and use it in GitHub Desktop.
using Microsoft.AspNetCore.Mvc;
using Newtonsoft.Json;
using ShoppingCartApp.ExtensionMethod;
using ShoppingCartApp.Models;
namespace ShoppingCartApp.Controllers
{
public class ShoppingCartController : Controller
{
public IActionResult Index()
{
return View();
}
public IActionResult Create(CartItem item)
{
AddToCart(item);
return View("Index");
}
public IActionResult Remove(CartItem item)
{
if (item == null)
{
return View("Index");
}
//Calling Item Remove Method and passing cart item
RemoveItemFromCart(item);
return View("Index");
}
public IActionResult RemoveAllItems()
{
//Calling Item Remove Method and passing cart item
RemoveAllItemFromCart();
return View("Index");
}
public IActionResult CheckOut()
{
//Do Check out stuff here
//Clear your shopping cart once checkout stuff done
RemoveAllItemFromCart();
return View("Index");
}
public void AddToCart(CartItem item)
{
var cart = HttpContext.Session.GetComplexObjectSession<ShoppingCartObject>("ShoppingCart");
if (cart != null)
{
cart!.CartItems!.Add(item);
HttpContext.Session.SetComplexObjectSession("ShoppingCart", cart);
}
else
{
cart = new ShoppingCartObject();
cart!.CartItems!.Add(item);
HttpContext.Session.SetComplexObjectSession("ShoppingCart", cart);
}
}
public void RemoveAllItemFromCart()
{
var cart = HttpContext.Session.GetComplexObjectSession<ShoppingCartObject>("ShoppingCart");
if (cart != null)
{
foreach (var item in new List<CartItem>(cart.CartItems))
{
cart!.CartItems!.Remove(item);
HttpContext.Session.SetComplexObjectSession("ShoppingCart", item);
}
}
}
public void RemoveItemFromCart(CartItem item)
{
var cart = HttpContext.Session.GetComplexObjectSession<ShoppingCartObject>("ShoppingCart");
cart!.CartItems!.Remove(cart.CartItems.Find(cartItem => cartItem.ItemName == item.ItemName));
HttpContext.Session.SetComplexObjectSession("ShoppingCart", cart);
}
}
}
namespace ShoppingCartApp.Models
{
public class ShoppingCartObject
{
public List<CartItem>? CartItems { get; set; } = new List<CartItem>();
}
}
using ShoppingCartApp.ExtensionMethod;
namespace ShoppingCartApp.Models
{
public class CartItem
{
public int CartId { get; set; }
public string? ItemName { get; set; }
public decimal Price { get; set; }
public decimal Total { get; set; } = decimal.Zero;
}
}
using Microsoft.AspNetCore.Mvc;
using ShoppingCartApp.ExtensionMethod;
using ShoppingCartApp.Models;
using System.Diagnostics;
namespace ShoppingCartApp.Controllers
{
public class HomeController : Controller
{
private readonly ILogger<HomeController> _logger;
public HomeController(ILogger<HomeController> logger)
{
_logger = logger;
}
public IActionResult Index()
{
return View();
}
public IActionResult Remove(CartItem item)
{
if (item == null)
{
return View("Index");
}
//Calling Item Remove Method and passing cart item
RemoveItemFromCart(item);
return View("Index");
}
public void RemoveItemFromCart(CartItem item)
{
Console.WriteLine($"Your function has executed item: {item.ItemName}");
}
public IActionResult Privacy()
{
return View();
}
[ResponseCache(Duration = 0, Location = ResponseCacheLocation.None, NoStore = true)]
public IActionResult Error()
{
return View(new ErrorViewModel { RequestId = Activity.Current?.Id ?? HttpContext.TraceIdentifier });
}
}
}
using Newtonsoft.Json;
namespace ShoppingCartApp.ExtensionMethod
{
public static class SessionExtension
{
//setting session
public static void SetComplexObjectSession(this ISession session, string key, object value)
{
session.SetString(key, JsonConvert.SerializeObject(value));
}
//getting session
public static T? GetComplexObjectSession<T>(this ISession session, string key)
{
var value = session.GetString(key);
return value == null ? default(T) : JsonConvert.DeserializeObject<T>(value);
}
}
}
var builder = WebApplication.CreateBuilder(args);
// Add services to the container.
builder.Services.AddControllersWithViews();
builder.Services.AddHttpContextAccessor();
builder.Services.AddSession(options =>
{
options.Cookie.Name = "shoppingCart";
options.IdleTimeout = TimeSpan.FromMinutes(5);
options.Cookie.IsEssential = true;
});
var app = builder.Build();
// Configure the HTTP request pipeline.
if (!app.Environment.IsDevelopment())
{
app.UseExceptionHandler("/Home/Error");
// The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseSession();
app.UseAuthorization();
app.MapControllerRoute(
name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}");
app.Run();
@model ShoppingCartApp.Models.CartItem
@{
ViewData["Title"] = "Home Page";
}
<div class="text-center">
<h1 class="display-4">Welcome</h1>
<p>Learn about <a href="https://docs.microsoft.com/aspnet/core">building Web apps with ASP.NET Core</a>.</p>
</div>
<div>
<form asp-action="Remove">
<input asp-for="@Model.ItemName" class="form-control" value="MyValue" hidden />
<input type="submit" value="Call Controller Method" class="btn btn-warning" />
</form>
</div>
@model ShoppingCartApp.Models.CartItem
@inject IHttpContextAccessor httpContextAccessor
@using ShoppingCartApp.ExtensionMethod
<div class="row">
<div class="col-sm-3">
<form method="post" asp-action="Create">
<div class="card" style="width: 18rem; margin-bottom:20px;box-shadow: rgba(0, 0, 0, 0.35) 0px 5px 15px;">
<div class="card-body">
<h5 class="card-title">C# Fundamental</h5>
<p class="card-text">A-Z of csharp</p>
<p class="card-text">$10.00</p>
<input asp-for="@Model.ItemName" class="form-control" value="C# Fundamental" hidden />
<input asp-for="@Model.Price" class="form-control" value="10" hidden />
<input type="submit" value="Add to cart" class="btn btn-primary" />
</div>
</div>
</form>
</div>
<div class="col-sm-3">
<form method="post" asp-action="Create">
<div class="card" style="width: 18rem; margin-bottom:20px;box-shadow: rgba(0, 0, 0, 0.35) 0px 5px 15px;">
<div class="card-body">
<h5 class="card-title">Asp.net core</h5>
<p class="card-text">A-Z of Asp.net core</p>
<p class="card-text">$15.00</p>
<input asp-for="@Model.ItemName" class="form-control" value="Asp.Net Core" hidden />
<input asp-for="@Model.Price" class="form-control" value="15" hidden />
<input type="submit" value="Add to cart" class="btn btn-primary" />
</div>
</div>
</form>
</div>
<div class="col-sm-3">
<form method="post" asp-action="Create">
<div class="card" style="width: 18rem; margin-bottom:20px;box-shadow: rgba(0, 0, 0, 0.35) 0px 5px 15px;">
<div class="card-body">
<h5 class="card-title">Asp.net Core Razor</h5>
<p class="card-text">A-Z of Razor</p>
<p class="card-text">$18.00</p>
<input asp-for="@Model.ItemName" class="form-control" value="Asp.net Core Razor" hidden />
<input asp-for="@Model.Price" class="form-control" value="18" hidden />
<input type="submit" value="Add to cart" class="btn btn-primary" />
</div>
</div>
</form>
</div>
@{
var shoppingCart = httpContextAccessor.HttpContext!.Session.GetComplexObjectSession<ShoppingCartObject>("ShoppingCart");
decimal totalPrice = 0;
if (shoppingCart != null)
{
<div class="col-sm-2">
<div class="card" style="width: 18rem; margin-bottom:20px;box-shadow: rgba(0, 0, 0, 0.35) 0px 5px 15px;">
<div class="card-body">
<h5 class="card-title">Shopping Cart</h5>
<table class="table">
<thead>
<tr>
<th>
Item
</th>
<th>
Price
</th>
</tr>
</thead>
<tbody>
@foreach (var item in shoppingCart!.CartItems!)
{
<tr>
<td>
@Html.DisplayFor(modelItem => item.ItemName)
</td>
<td>
@Html.DisplayFor(modelItem => item.Price)
</td>
<td>
<form asp-action="Remove">
<input asp-for="@Model.ItemName" class="form-control" value="@item.ItemName" hidden />
<input type="submit" value="Remove" class="btn btn-warning" />
</form>
</td>
</tr>
totalPrice += item.Price;
}
</tbody>
</table>
<strong style="margin-right:153px">Total</strong> <strong><i>$ @totalPrice</i></strong>
<div class="row" style="margin-top:20px">
<div class="col-md-6">
<form asp-action="RemoveAllItems">
<input type="submit" value="Clear All Item" class="btn btn-danger"/>
</form>
</div>
<div class="col-md-6">
<form asp-action="CheckOut">
<input type="submit" value="Check Out" class="btn btn-success" />
</form>
</div>
</div>
</div>
</div>
</div>
}
}
</div>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment