Created
June 15, 2024 23:38
-
-
Save rahiyansafz/d3a5f59891bc9c46e1659dda1fb355d9 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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