日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

ASP.NET MVC實現橫向展示購物車

瀏覽:558日期:2022-06-08 10:22:14

通常,我們看到的購物車是這樣的:

雖然這種購物車顯示方式被廣泛運用,但我個人覺得不夠直觀。如果換成這樣呢?

本篇的源碼放在了:https://github.com/darrenji/ShoppingCartInMVC

以上購物車頁能實現的效果包括:
1、購物車明細:顯示訂購數量、總金額,清空購物車。
2、購物車內產品:數量可調整,對應的小計和總計動態變化。點擊移除按鈕移除該產品。
3、繼續購物按鈕:點擊左下角的繼續購物按鈕,回到先前頁。
4、使用了Bootstrap, 頁面元素自適應,頁面寬度調小時,頁面布局動態變化。
5、每行放置4個產品,且允許高度不一致,第5個產品另起一行,且不會float到上一行的空白區域,如下圖。

首先,有關產品的類。

    public class Product    {public int Id { get; set; }public string Name { get; set; }public string ImageUrl { get; set; }public string Description { get; set; }public decimal Price { get; set; }    }

產品選購頁如圖:

以上,產品選購頁是一個有關Product集合的強類型視圖頁,其對應的Model為:

    public class ProductsListVm    {public ProductsListVm(){    this.Products = new List<Product>();}public IEnumerable<Product> Products { get; set; }    }

想像一下,我們在超市購物,在購物車內放著不同的商品對應不同的數量,在這里,可以把商品和數量抽象成一個類:

    public class CartLine    {public Product Product { get; set; }public int Quantity { get; set; }    }

而購物車類實際上就是維護著這個CartLine集合,需要提供添加、移除、計算購物車總價、清空購物車等方法,并提供一個獲取到CartLine集合的屬性,另外,針對點擊購物車頁上的增量和減量按鈕,也要提供相應的方法。

    public class Cart    {private List<CartLine> lineCollection = new List<CartLine>();//添加public void AddItem(Product product, int quantity){    CartLine line = lineCollection.Where(p => p.Product.Id == product.Id).FirstOrDefault();    if (line == null)    {lineCollection.Add(new CartLine(){Product = product, Quantity = quantity});    }    else    {line.Quantity += quantity;    }}//點擊數量+號或點擊數量-號或自己輸入一個值public void IncreaseOrDecreaseOne(Product product, int quantity){    CartLine line = lineCollection.Where(p => p.Product.Id == product.Id).FirstOrDefault();    if (line != null)    {line.Quantity = quantity;    }}//移除public void RemoveLine(Product product){    lineCollection.RemoveAll(p => p.Product.Id == product.Id);}//計算總價public decimal ComputeTotalPrice(){    return lineCollection.Sum(p => p.Product.Price*p.Quantity);}//清空public void Clear(){    lineCollection.Clear();}//獲取public IEnumerable<CartLine> Lines{    get { return lineCollection; }}    }

購物車頁自然就是針對Cart類的一個強類型視圖頁,嗯,等等,購物車頁還需要記錄下上一個頁面的url,于是,考慮到把Cart類和記錄上一個頁面url這2個因素,針對購物車頁,給出這樣的一個Model:

    public class CartIndexVm    {public Cart Cart { get; set; }public string ReturnUrl { get; set; }    }

在HomeController中,需要用到購物車的實例,可以這樣寫:

private Cart GetCart(){    Cart cart = (Cart)Session["Cart"];    if (cart == null)    {cart = new Cart();Session["Cart"] = cart;    }    return cart;}

Cart實例保存到Session中,并從Session中獲取。當然,也可以放到ASP.NET MVC綁定機制中,需要做的就是實現IModelBinder接口。

    public class CartModelBinder : IModelBinder    {private const string sessionKey = "Cart";public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext){    Cart cart = (Cart)controllerContext.HttpContext.Session[sessionKey];    if (cart == null)    {cart = new Cart();controllerContext.HttpContext.Session[sessionKey] = cart;    }    return cart;}    }

自定義的ModelBinder需要在全局中注冊。

    public class MvcApplication : System.Web.HttpApplication    {protected void Application_Start(){    AreaRegistration.RegisterAllAreas();    ......    ModelBinders.Binders.Add(typeof(Cart), new CartModelBinder());}    }

在Home控制器中,首先提供了一個返回Product集合的方法。

private List<Product> GetAllProducts(){    return new List<Product>()    {new Product(){Id = 1, Description = "產品描述產品描述產品描述產品描述產品描述產品描述產品描述",ImageUrl = "/images/1.jpg",Name = "產品1",Price = 85M},new Product(){Id = 2, Description = "產品描述產品描述產品描述產品描述產品描述產品描述產品描述",ImageUrl = "/images/2.jpg",Name = "產品2",Price = 95M},new Product(){Id = 3, Description = "產品描述產品描述產品描述",ImageUrl = "/images/2.jpg",Name = "產品3",Price = 55M},new Product(){Id = 4, Description = "產品描述產品描述產品描述產品描述產品描述產品描述產品描述",ImageUrl = "/images/1.jpg",Name = "產品4",Price = 65M},new Product(){Id = 5, Description = "產品描述產品描述產品描述產品描述產品描述產品描述產品描述",ImageUrl = "/images/2.jpg",Name = "產品5",Price = 75M}    };}

在HomeController中,有關產品選購頁的如下:

//產品選購頁public ActionResult Index(){    ProductsListVm productsListVm = new ProductsListVm();    productsListVm.Products = GetAllProducts();    return View(productsListVm);}

Homme/Index.cshtml是一個ProductsListVm的強類型視圖頁。

@model MvcApplication1.Models.ProductsListVm@{    ViewBag.Title = "Index";    Layout = "~/Views/Shared/_Layout.cshtml";}<style type="text/css">    .item {border-bottom: solid 1px gray;    }</style><div>    <div>@foreach (var item in Model.Products){    Html.RenderPartial("ProductSummary", item);}    </div></div>

其中,遍歷Product集合的時候,又去加載Views/Shared/ProductSummary.cshtml這個強類型部分視圖。

@model MvcApplication1.Models.Product<div>    <h3>@Model.Name</h3>    <p><img src="@Model.ImageUrl"/></p>    <p>@Model.Description</p>    <h4>@Model.Price.ToString("c")</h4>    @using (Html.BeginForm("AddToCart", "Home"))    {@Html.HiddenFor(p => p.Id)@Html.Hidden("returnUrl", Request.Url.PathAndQuery)<input type="submit" value="+放入購物車"/>    }</div>

點擊"+放入購物車"按鈕,調用HomeController中的AddToCart方法,并且需要把選購產品頁的url以query string的形式傳遞給控制器方法。

//購物車頁public ActionResult CartIndex(Cart cart, string returnUrl){    return View(new CartIndexVm    {Cart = cart,ReturnUrl = returnUrl    });}//添加到購物車public ActionResult AddToCart(Cart cart, int id, string returnUrl){    Product product = GetAllProducts().Where(p => p.Id == id).FirstOrDefault();    if (product != null)    {cart.AddItem(product, 1);    }    return RedirectToAction("CartIndex", new {returnUrl});}

購物車頁Home/CartIndex.cshtml是一個CartIndexVm的強類型視圖頁。

@model MvcApplication1.Models.CartIndexVm@{    ViewBag.Title = "CartIndex";    Layout = "~/Views/Shared/_Layout.cshtml";}@section styles{    <link href="~/Content/shopitem.css" rel="external nofollow"  rel="stylesheet" />    <link href="~/Content/jquery.bootstrap-touchspin.min.css" rel="external nofollow"  rel="stylesheet" />}<div>    <div>      @for (int i = 0; i < Model.Cart.Lines.Count(); i++)      {  var item = (Model.Cart.Lines.ToList())[i];  if (i != 0 && i%4 == 0) //每行有4個div  {      <div></div>  }    <div> <img src="@item.Product.ImageUrl"><div>    <div>@item.Product.Name</div>    <div>@item.Product.Description</div>    <div><table>    <tr><td>單價:</td><td>@item.Product.Price</td>    </tr>    <tr><td>數量:</td><td>    <input type="text" value="@item.Quantity" name="demo2" /></td>    </tr>    <tr><td>小計:</td><td>@((item.Quantity * item.Product.Price).ToString("c"))</td>    </tr></table>    </div></div><div>    <div>@using (Html.BeginForm("RemoveFromCart", "Home")){    @Html.Hidden("Id", item.Product.Id)    @Html.HiddenFor(x => x.ReturnUrl)    <input type="submit" value="移除"/>    <a href="#" rel="external nofollow"  role="button">查看</a>}    </div></div>    </div>      }          </div></div><hr/><div>    <div><div>   <span>總計:</span> @Model.Cart.ComputeTotalPrice().ToString("c")</div><p align="left">    <a href="@Model.ReturnUrl" rel="external nofollow" >繼續購物</a></p>    </div></div>@section scripts{    <script src="~/Scripts/jquery.bootstrap-touchspin.min.js"></script>    <script type="text/javascript">$(function () {    var i = $("input[class="demo2"]");    i.TouchSpin({min: 1,max: 100,step: 1//增量或減量    });    i.on("touchspin.on.stopupspin", function () {$.post("@Url.Action("IncreaseOrDecreaseOne", "Home")", { "id": $(this).closest("div.productbox").find("#Id").val(), "quantity": $(this).val() }, function (data) {    if (data.msg) {location.reload();    }});//var temp = $(this).val();//alert(temp);//var temp = $(this).closest("div.productbox").find("#Id").val();//alert(temp);    });    i.on("touchspin.on.stopdownspin", function () {$.post("@Url.Action("IncreaseOrDecreaseOne", "Home")", { "id": $(this).closest("div.productbox").find("#Id").val(), "quantity": $(this).val() }, function (data) {    if (data.msg) {location.reload();    }});    });});    </script>}

在購物車頁,用了Bootstrap TouchSpin這款插件,點擊其中的數量的增量和減量按鈕,就向Home控制器中的IncreaseOrDecreaseOne方法發送一個異步post請求,得到返回數據刷新購物車頁。

       //點擊數量+號或點擊數量-號或自己輸入一個值[HttpPost]public ActionResult IncreaseOrDecreaseOne(Cart cart, int id, int quantity) {    Product product = GetAllProducts().Where(p => p.Id == id).FirstOrDefault();    if (product != null)    {cart.IncreaseOrDecreaseOne(product, quantity);    }    return Json(new    {msg = true    });}

在購車頁,點擊"移除"按鈕,就向Home控制器的RemoveFromCart方法提交表單。

//從購物車移除public ActionResult RemoveFromCart(Cart cart, int id, string returnUrl){    Product product = GetAllProducts().Where(p => p.Id == id).FirstOrDefault();    if (product != null)    {cart.RemoveLine(product);    }    return RedirectToAction("CartIndex", new {returnUrl});}

購物車摘要是通過在Views/Shared/_Layout.cshtml中加載部分視圖而來。

<head>    <meta charset="utf-8" />    <meta name="viewport" content="width=device-width" />    <title>@ViewBag.Title</title>    @Styles.Render("~/Content/css")    <link href="~/bootstrap/css/bootstrap.min.css" rel="external nofollow"  rel="stylesheet" />    @RenderSection("styles", required: false)    @Scripts.Render("~/bundles/jquery")    <script src="~/bootstrap/js/bootstrap.min.js"></script></head><body>    @{Html.RenderAction("Summary", "Home");}    @RenderBody()    @RenderSection("scripts", required: false)</body>

在Home控制器中,對應的Summary方法為:

//清空購物車public ActionResult EmptyCart(Cart cart, string returnUrl){    cart.Clear();    return View("Index",new ProductsListVm{Products = GetAllProducts()});}//顯示購物車摘要public ActionResult Summary(Cart cart){    return View(cart);}

Home/Summary.cshtml是一個有關Cart的強類型部分視圖:

@model MvcApplication1.Models.Cart@{    Layout = null;}<div id="cart">    <span><b>購物車明細:</b>@if (Model != null){    @Model.Lines.Sum(x => x.Quantity) <span>件,</span>    @Model.ComputeTotalPrice().ToString("c")}    </span>        @Html.ActionLink("結算", "CartIndex", "Home", new {returnUrl = Request.Url.PathAndQuery}, null)    &nbsp;    @Html.ActionLink("清空", "EmptyCart", "Home", new {returnUrl = Request.Url.PathAndQuery}, null)</div>

注意:需要把Layout設置為null,否則會報錯,因為產品選購頁和購物車摘要同時加載Views/Shared/_Layout.cshtml就反復調用了。

到此這篇關于ASP.NET MVC實現橫向展示購物車的文章就介紹到這了。希望對大家的學習有所幫助,也希望大家多多支持。

標簽: ASP.NET
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
日韩中文字幕不卡| 亚洲欧洲日韩精品在线| 免费日本视频一区| 亚洲国产专区| 97精品一区| 高清不卡亚洲| 伊人久久视频| se01亚洲视频| 亚洲性视频h| 在线精品视频在线观看高清| 午夜日韩福利| 久热re这里精品视频在线6| 蜜臀久久久久久久| 亚洲精品乱码| 国产精品天天看天天狠| 欧美激情精品| 日韩精品免费一区二区三区| 久久人人97超碰国产公开结果| 欧美不卡高清一区二区三区| 日韩国产综合| 国产精品普通话对白| 日本不卡一二三区黄网| 国产女人18毛片水真多18精品| 国产精品分类| 久久天堂成人| 日韩黄色av| 91一区二区三区四区| 激情久久久久久久| 免费观看不卡av| 婷婷精品在线观看| 国产成人久久精品麻豆二区 | 91在线成人| 日本激情一区| 日本欧洲一区二区| 久久久免费人体| 欧美+日本+国产+在线a∨观看| 日本在线成人| 五月激情久久| 欧美日本不卡| 亚洲精品小说| 成午夜精品一区二区三区软件| 午夜国产精品视频| 国产精品九九| 老司机精品久久| 福利片在线一区二区| 久久精品青草| 精品欧美日韩精品| 日韩和欧美的一区| 精品欧美激情在线观看| 国产精品va| 综合色一区二区| 99久久视频| 成人在线视频区| 国产精品www994| 影音先锋久久精品| 欧美女激情福利| 日韩av免费| 欧美天堂视频| 国产一区二区三区不卡视频网站| 日韩中文av| 亚洲作爱视频| 国产伊人精品| 欧美不卡在线| 日韩欧美1区| 国产精选在线| 日韩欧美精品| 秋霞影院一区二区三区| 久久男人av资源站| 美女福利一区二区三区| 国产精品99久久精品| 精品视频91| 精品国产一级| 日韩精品诱惑一区?区三区| 国产一区二区三区久久久久久久久| 91国内精品| 欧美激情亚洲| 精品三级国产| 久久电影tv| 亚洲午夜精品久久久久久app| | 欧美三区不卡| 久久久免费人体| 久久精品动漫| 日韩在线a电影| 国产精品一区二区av交换 | 久久影院午夜精品| 国产精品伦理久久久久久| 韩国三级一区| 久久亚洲二区| 天堂成人免费av电影一区 | 日韩中文字幕亚洲一区二区va在线 | 国产欧美高清视频在线| 婷婷亚洲精品| 国产精品久久乐| 日本国产精品| 欧美成人午夜| 国产欧美另类| 少妇精品导航| 日本一区中文字幕| 人在线成免费视频| 午夜在线精品| 成人三级高清视频在线看| 99在线精品视频在线观看| 国产精品调教| av成人国产| 在线看片福利| 亚洲精品高潮| 国产精品不卡| 日本免费一区二区视频| 婷婷精品视频| 牛牛精品成人免费视频| 亚洲二区免费| 麻豆精品在线| 亚洲免费观看高清完整版在线观| 里番精品3d一二三区| 亚洲资源网站| 日韩一级欧洲| 91亚洲国产成人久久精品| 日本91福利区| 好吊日精品视频| 日韩免费高清| 精品一区二区三区的国产在线观看 | 久久国产日韩| 国产精品99久久免费观看| 中文字幕日韩亚洲| 麻豆国产在线| 国产精品超碰| 日韩欧美中文字幕一区二区三区| 好看不卡的中文字幕| 国产h片在线观看| 麻豆精品在线播放| 男女男精品视频网| 啪啪国产精品| 色黄视频在线观看| 成人午夜亚洲| 精品国产午夜肉伦伦影院| 欧美久久久网站| 日韩精品一区二区三区免费视频| 狠狠色狠狠色综合日日tαg| 亚洲欧洲高清| 欧美二三四区| 久久精品免费一区二区三区| 国产成人1区| 久久久久久色| 日韩精品亚洲aⅴ在线影院| 色综合视频一区二区三区日韩| 成午夜精品一区二区三区软件| 国产欧美成人| 国产劲爆久久| 国产一区2区在线观看| 国产精品久久久久久久久妇女| 91视频一区| 久久理论电影| 蜜桃av一区| 日韩中文字幕无砖| 国产美女视频一区二区| 国产精品mv在线观看| 久久精品一本| 韩国精品主播一区二区在线观看| 国产一在线精品一区在线观看| 婷婷精品进入| 日韩国产在线不卡视频| 91久久精品无嫩草影院| 美女久久久精品| 午夜欧美精品| 欧美日韩亚洲三区| 热三久草你在线| 亚洲一区二区小说| 久久99视频| 99精品99| 精品久久不卡| 免费中文字幕日韩欧美| 国产欧美亚洲一区| 激情综合激情| 久久久精品国产**网站| 亚洲激情另类| 久久精品五月| 久久中文字幕av| 欧美黄色一区| 久久亚洲电影| 精品国模一区二区三区| 综合干狼人综合首页| 丰满少妇一区| 亚洲一二三区视频| 超级白嫩亚洲国产第一| 亚洲精品看片| 欧美日韩国产高清| 国产精品www994| 亚州av乱码久久精品蜜桃| 日韩成人午夜精品| 9色精品在线| 久久精品动漫| 欧美伊人影院| 天海翼精品一区二区三区| 久久伦理在线| 久久黄色影院| 欧洲一区二区三区精品| 国产在线观看91一区二区三区| 91精品国产一区二区在线观看 | 亚洲人亚洲人色久|