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

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

ASP.NET MVC實(shí)現(xiàn)橫向展示購(gòu)物車(chē)

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

通常,我們看到的購(gòu)物車(chē)是這樣的:

雖然這種購(gòu)物車(chē)顯示方式被廣泛運(yùn)用,但我個(gè)人覺(jué)得不夠直觀。如果換成這樣呢?

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

以上購(gòu)物車(chē)頁(yè)能實(shí)現(xiàn)的效果包括:
1、購(gòu)物車(chē)明細(xì):顯示訂購(gòu)數(shù)量、總金額,清空購(gòu)物車(chē)。
2、購(gòu)物車(chē)內(nèi)產(chǎn)品:數(shù)量可調(diào)整,對(duì)應(yīng)的小計(jì)和總計(jì)動(dòng)態(tài)變化。點(diǎn)擊移除按鈕移除該產(chǎn)品。
3、繼續(xù)購(gòu)物按鈕:點(diǎn)擊左下角的繼續(xù)購(gòu)物按鈕,回到先前頁(yè)。
4、使用了Bootstrap, 頁(yè)面元素自適應(yīng),頁(yè)面寬度調(diào)小時(shí),頁(yè)面布局動(dòng)態(tài)變化。
5、每行放置4個(gè)產(chǎn)品,且允許高度不一致,第5個(gè)產(chǎn)品另起一行,且不會(huì)float到上一行的空白區(qū)域,如下圖。

首先,有關(guān)產(chǎn)品的類(lèi)。

    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; }    }

產(chǎn)品選購(gòu)頁(yè)如圖:

以上,產(chǎn)品選購(gòu)頁(yè)是一個(gè)有關(guān)Product集合的強(qiáng)類(lèi)型視圖頁(yè),其對(duì)應(yīng)的Model為:

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

想像一下,我們?cè)诔匈?gòu)物,在購(gòu)物車(chē)內(nèi)放著不同的商品對(duì)應(yīng)不同的數(shù)量,在這里,可以把商品和數(shù)量抽象成一個(gè)類(lèi):

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

而購(gòu)物車(chē)類(lèi)實(shí)際上就是維護(hù)著這個(gè)CartLine集合,需要提供添加、移除、計(jì)算購(gòu)物車(chē)總價(jià)、清空購(gòu)物車(chē)等方法,并提供一個(gè)獲取到CartLine集合的屬性,另外,針對(duì)點(diǎn)擊購(gòu)物車(chē)頁(yè)上的增量和減量按鈕,也要提供相應(yīng)的方法。

    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;    }}//點(diǎn)擊數(shù)量+號(hào)或點(diǎn)擊數(shù)量-號(hào)或自己輸入一個(gè)值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);}//計(jì)算總價(jià)public decimal ComputeTotalPrice(){    return lineCollection.Sum(p => p.Product.Price*p.Quantity);}//清空public void Clear(){    lineCollection.Clear();}//獲取public IEnumerable<CartLine> Lines{    get { return lineCollection; }}    }

購(gòu)物車(chē)頁(yè)自然就是針對(duì)Cart類(lèi)的一個(gè)強(qiáng)類(lèi)型視圖頁(yè),嗯,等等,購(gòu)物車(chē)頁(yè)還需要記錄下上一個(gè)頁(yè)面的url,于是,考慮到把Cart類(lèi)和記錄上一個(gè)頁(yè)面url這2個(gè)因素,針對(duì)購(gòu)物車(chē)頁(yè),給出這樣的一個(gè)Model:

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

在HomeController中,需要用到購(gòu)物車(chē)的實(shí)例,可以這樣寫(xiě):

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

Cart實(shí)例保存到Session中,并從Session中獲取。當(dāng)然,也可以放到ASP.NET MVC綁定機(jī)制中,需要做的就是實(shí)現(xiàn)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需要在全局中注冊(cè)。

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

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

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

在HomeController中,有關(guān)產(chǎn)品選購(gòu)頁(yè)的如下:

//產(chǎn)品選購(gòu)頁(yè)public ActionResult Index(){    ProductsListVm productsListVm = new ProductsListVm();    productsListVm.Products = GetAllProducts();    return View(productsListVm);}

Homme/Index.cshtml是一個(gè)ProductsListVm的強(qiáng)類(lèi)型視圖頁(yè)。

@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集合的時(shí)候,又去加載Views/Shared/ProductSummary.cshtml這個(gè)強(qiáng)類(lèi)型部分視圖。

@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="+放入購(gòu)物車(chē)"/>    }</div>

點(diǎn)擊"+放入購(gòu)物車(chē)"按鈕,調(diào)用HomeController中的AddToCart方法,并且需要把選購(gòu)產(chǎn)品頁(yè)的url以query string的形式傳遞給控制器方法。

//購(gòu)物車(chē)頁(yè)public ActionResult CartIndex(Cart cart, string returnUrl){    return View(new CartIndexVm    {Cart = cart,ReturnUrl = returnUrl    });}//添加到購(gòu)物車(chē)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});}

購(gòu)物車(chē)頁(yè)Home/CartIndex.cshtml是一個(gè)CartIndexVm的強(qiáng)類(lèi)型視圖頁(yè)。

@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個(gè)div  {      <div></div>  }    <div> <img src="@item.Product.ImageUrl"><div>    <div>@item.Product.Name</div>    <div>@item.Product.Description</div>    <div><table>    <tr><td>單價(jià):</td><td>@item.Product.Price</td>    </tr>    <tr><td>數(shù)量:</td><td>    <input type="text" value="@item.Quantity" name="demo2" /></td>    </tr>    <tr><td>小計(jì):</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>總計(jì):</span> @Model.Cart.ComputeTotalPrice().ToString("c")</div><p align="left">    <a href="@Model.ReturnUrl" rel="external nofollow" >繼續(xù)購(gòu)物</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>}

在購(gòu)物車(chē)頁(yè),用了Bootstrap TouchSpin這款插件,點(diǎn)擊其中的數(shù)量的增量和減量按鈕,就向Home控制器中的IncreaseOrDecreaseOne方法發(fā)送一個(gè)異步post請(qǐng)求,得到返回?cái)?shù)據(jù)刷新購(gòu)物車(chē)頁(yè)。

       //點(diǎn)擊數(shù)量+號(hào)或點(diǎn)擊數(shù)量-號(hào)或自己輸入一個(gè)值[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    });}

在購(gòu)車(chē)頁(yè),點(diǎn)擊"移除"按鈕,就向Home控制器的RemoveFromCart方法提交表單。

//從購(gòu)物車(chē)移除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});}

購(gòu)物車(chē)摘要是通過(guò)在Views/Shared/_Layout.cshtml中加載部分視圖而來(lái)。

<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控制器中,對(duì)應(yīng)的Summary方法為:

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

Home/Summary.cshtml是一個(gè)有關(guān)Cart的強(qiáng)類(lèi)型部分視圖:

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

注意:需要把Layout設(shè)置為null,否則會(huì)報(bào)錯(cuò),因?yàn)楫a(chǎn)品選購(gòu)頁(yè)和購(gòu)物車(chē)摘要同時(shí)加載Views/Shared/_Layout.cshtml就反復(fù)調(diào)用了。

到此這篇關(guān)于ASP.NET MVC實(shí)現(xiàn)橫向展示購(gòu)物車(chē)的文章就介紹到這了。希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持。

標(biāo)簽: ASP.NET
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
亚洲天堂久久| 神马午夜在线视频| 国产一区久久| 亚洲激情欧美| 亚洲自啪免费| 日本一区二区三区视频在线看| 亚洲免费影院| 日本不卡视频在线| 国产日韩免费| 久久精品天堂| 麻豆精品视频在线观看视频| 91精品国产自产观看在线 | 国产日韩欧美一区在线| 国产一区二区精品| 欧美精品九九| 蜜臀久久99精品久久久久久9| 亚洲人亚洲人色久| 欧美激情精品| 99精品在线| 日韩精品社区| 亚洲婷婷在线| 国产精品99久久久久久董美香| 久久精品女人| 99精品在线观看| 日本麻豆一区二区三区视频| 91亚洲自偷观看高清| 亚洲一区二区毛片| 人人精品人人爱| 亚洲美女91| 在线亚洲人成| 欧美日韩一区自拍| 国产高清亚洲| 欧美一级专区| 久久精品国产久精国产| 国产美女一区| 亚洲有吗中文字幕| 欧美日韩日本国产亚洲在线 | 免费人成精品欧美精品| 欧美日韩中文| 欧美日韩视频免费看| 欧美成a人免费观看久久| 美女性感视频久久| 青青草伊人久久| 蜜桃视频在线观看一区| 欧美精品aa| 亚洲专区视频| 在线手机中文字幕| 男人的天堂久久精品| 91亚洲一区| 国产亚洲欧美日韩精品一区二区三区| 国产99亚洲| 97精品国产| 国产精品片aa在线观看| 日韩专区欧美专区| 亚洲毛片网站| 国产毛片精品| 精品一区二区三区亚洲| 亚洲一区二区免费看| 日韩欧美精品综合| 国产videos久久| 国产精品久久乐| 日韩专区欧美专区| 99精品在线观看| 日本欧美不卡| 91精品国产调教在线观看| 久久99久久久精品欧美| 91在线成人| 亚洲精品在线a| 美美哒免费高清在线观看视频一区二区| 国产精品亚洲一区二区在线观看| 亚洲精品成人一区| 亚洲一级高清| 先锋影音久久久| 99视频一区| 日本不卡中文字幕| 日韩成人精品一区二区三区| 欧美伊人久久| 欧美综合社区国产| 97se亚洲| 免费在线欧美黄色| 午夜久久中文| 久久久一本精品| 特黄毛片在线观看| 欧美理论视频| 欧美日韩少妇| 国产精品麻豆成人av电影艾秋| 麻豆精品久久| 午夜日韩福利| 日韩精品中文字幕吗一区二区| 国产精品久久久久久妇女| 快she精品国产999| 亚洲精品九九| 日韩成人亚洲| 日韩综合一区| 亚洲女人av| 天堂av在线一区| 久久国产人妖系列| 99在线精品免费视频九九视 | 激情综合自拍| 精品视频91| 日韩精品五月天| 免费精品视频最新在线| 婷婷久久一区| 在线一区视频观看| 成人午夜亚洲| 精品国产乱码| 精品久久99| 久久久久久色 | 国产精品一区免费在线| 日韩在线精品| 91日韩在线| 日韩美女一区二区三区在线观看| 国产不卡av一区二区| 精品亚洲免a| 久久婷婷国产| 成人黄色av| 超碰超碰人人人人精品| 韩国女主播一区二区三区| 欧美国产另类| 高潮久久久久久久久久久久久久| 久久精品毛片| 国产综合色产| 亚洲视频电影在线| 国产图片一区| 国产va免费精品观看精品视频| 国产韩日影视精品| 美女毛片一区二区三区四区最新中文字幕亚洲 | 免播放器亚洲一区| 丝袜美腿高跟呻吟高潮一区| 国产精品av一区二区| 五月婷婷六月综合| 亚洲精品网址| а√天堂8资源在线| 欧产日产国产精品视频| 色一区二区三区| av高清不卡| 亚洲性视频h| 男女男精品网站| 日韩精品一区二区三区中文字幕| 欧美日韩亚洲一区二区三区在线| 日韩不卡一区二区三区| 欧美综合社区国产| 国产精品成人一区二区不卡| 偷拍精品精品一区二区三区| 国精品一区二区| 国产精品女主播一区二区三区| 在线综合亚洲| 蜜桃传媒麻豆第一区在线观看| 亚洲aa在线| 欧美激情 亚洲a∨综合| 国产美女高潮在线观看| 五月综合激情| 国产欧美精品久久| 日韩亚洲精品在线观看| 大香伊人久久精品一区二区| 免费不卡中文字幕在线| 亚洲精品高潮| 精品国产99| 免费一级片91| 中文字幕在线官网| 日韩精品一卡二卡三卡四卡无卡| 国产亚洲欧美日韩在线观看一区二区| 国产亚洲欧美日韩精品一区二区三区| 国产成人黄色| 亚洲婷婷丁香| 韩国精品主播一区二区在线观看| 日韩国产欧美在线播放| 高清av一区二区三区| 国产精东传媒成人av电影| 欧美日韩一区二区综合| 国产精品欧美三级在线观看| 久久久久久免费视频| 国产精品一国产精品| 六月天综合网| 欧美日韩中文一区二区| 国产成年精品| 欧美国产中文高清| 国产一区成人| 日本免费久久| 麻豆精品久久| 国产精品1luya在线播放| 日韩av成人高清| 蜜臀va亚洲va欧美va天堂 | 在线手机中文字幕| 国产精品igao视频网网址不卡日韩| 西西人体一区二区| 黄色日韩在线| 午夜久久黄色| 亚洲欧美日本国产专区一区| 久久激情中文| 98精品视频| 久久男人天堂| 国产精品99一区二区三| 国产精品毛片一区二区在线看| 精品亚洲精品| 欧美天堂视频| 尹人成人综合网| 中文精品电影| 清纯唯美亚洲综合一区| 国产精品大片免费观看|