电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

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

ASP.NET MVC實現(xiàn)橫向展示購物車

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

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

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

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

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

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

    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)品選購頁如圖:

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

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

想像一下,我們在超市購物,在購物車內(nèi)放著不同的商品對應(yīng)不同的數(shù)量,在這里,可以把商品和數(shù)量抽象成一個類:

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

而購物車類實際上就是維護(hù)著這個CartLine集合,需要提供添加、移除、計算購物車總價、清空購物車等方法,并提供一個獲取到CartLine集合的屬性,另外,針對點(diǎn)擊購物車頁上的增量和減量按鈕,也要提供相應(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ù)量+號或點(diǎn)擊數(shù)量-號或自己輸入一個值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類的一個強(qiáng)類型視圖頁,嗯,等等,購物車頁還需要記錄下上一個頁面的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中獲取。當(dāng)然,也可以放到ASP.NET MVC綁定機(jī)制中,需要做的就是實現(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需要在全局中注冊。

    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 = "產(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)品選購頁的如下:

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

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

@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這個強(qiáng)類型部分視圖。

@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>

點(diǎn)擊"+放入購物車"按鈕,調(diào)用HomeController中的AddToCart方法,并且需要把選購產(chǎn)品頁的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的強(qiáng)類型視圖頁。

@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>數(shù)量:</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" >繼續(xù)購物</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這款插件,點(diǎn)擊其中的數(shù)量的增量和減量按鈕,就向Home控制器中的IncreaseOrDecreaseOne方法發(fā)送一個異步post請求,得到返回數(shù)據(jù)刷新購物車頁。

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

在購車頁,點(diǎn)擊"移除"按鈕,就向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控制器中,對應(yīng)的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是一個有關(guān)Cart的強(qiáng)類型部分視圖:

@model MvcApplication1.Models.Cart@{    Layout = null;}<div id="cart">    <span><b>購物車明細(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,否則會報錯,因為產(chǎn)品選購頁和購物車摘要同時加載Views/Shared/_Layout.cshtml就反復(fù)調(diào)用了。

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

標(biāo)簽: ASP.NET
相關(guān)文章:
主站蜘蛛池模板: 汽车润滑油厂家-机油/润滑油代理-高性能机油-领驰慧润滑科技(河北)有限公司 | 国标白水泥,高标号白水泥,白水泥厂家-淄博华雪建材有限公司 | 河南生物显微镜,全自动冰冻切片机-河南荣程联合科技有限公司 | 安徽净化工程设计_无尘净化车间工程_合肥净化实验室_安徽创世环境科技有限公司 | 智能电表|预付费ic卡水电表|nb智能无线远传载波电表-福建百悦信息科技有限公司 | 洁净化验室净化工程_成都实验室装修设计施工_四川华锐净化公司 | 2-羟基泽兰内酯-乙酰蒲公英萜醇-甘草查尔酮A-上海纯优生物科技有限公司 | 建大仁科-温湿度变送器|温湿度传感器|温湿度记录仪_厂家_价格-山东仁科 | 微波萃取合成仪-电热消解器价格-北京安合美诚科学仪器有限公司 | SMC-ASCO-CKD气缸-FESTO-MAC电磁阀-上海天筹自动化设备官网 | 陶瓷砂磨机,盘式砂磨机,棒销式砂磨机-无锡市少宏粉体科技有限公司 | 沈阳缠绕包装机厂家直销-沈阳海鹞托盘缠绕包装机价格 | 烘干设备-热泵烘干机_广东雄贵能源设备有限公司 | 北京企业宣传片拍摄_公司宣传片制作-广告短视频制作_北京宣传片拍摄公司 | Safety light curtain|Belt Sway Switches|Pull Rope Switch|ultrasonic flaw detector-Shandong Zhuoxin Machinery Co., Ltd | 内六角扳手「厂家」-温州市威豪五金工具有限公司 | 即用型透析袋,透析袋夹子,药敏纸片,L型涂布棒-上海桥星贸易有限公司 | 除湿机|工业除湿机|抽湿器|大型地下室车间仓库吊顶防爆除湿机|抽湿烘干房|新风除湿机|调温/降温除湿机|恒温恒湿机|加湿机-杭州川田电器有限公司 | 网站建设-高端品牌网站设计制作一站式定制_杭州APP/微信小程序开发运营-鼎易科技 | 深圳成考网-深圳成人高考报名网 深圳工程师职称评定条件及流程_深圳职称评审_职称评审-职称网 | 三氯异氰尿酸-二氯-三氯-二氯异氰尿酸钠-优氯净-强氯精-消毒片-济南中北_优氯净厂家 | 电机铸铝配件_汽车压铸铝合金件_发动机压铸件_青岛颖圣赫机械有限公司 | BOE画框屏-触摸一体机-触控查询一体机-触摸屏一体机价格-厂家直销-触发电子 | 长信科技产业园官网_西安厂房_陕西标准工业厂房 | 本安接线盒-本安电路用接线盒-本安分线盒-矿用电话接线盒-JHH生产厂家-宁波龙亿电子科技有限公司 | 餐饮加盟网_特色餐饮加盟店_餐饮连锁店加盟| 氨水-液氨-工业氨水-氨水生产厂家-辽宁顺程化工 | ?水马注水围挡_塑料注水围挡_防撞桶-常州瑞轩水马注水围挡有限公司 | 100_150_200_250_300_350_400公斤压力空气压缩机-舰艇航天配套厂家 | 网站seo优化_seo云优化_搜索引擎seo_启新网络服务中心 | 成都治疗尖锐湿疣比较好的医院-成都治疗尖锐湿疣那家医院好-成都西南皮肤病医院 | 石家庄网站建设|石家庄网站制作|石家庄小程序开发|石家庄微信开发|网站建设公司|网站制作公司|微信小程序开发|手机APP开发|软件开发 | 福建珂朗雅装饰材料有限公司「官方网站」 | 丝印油墨_水性油墨_环保油墨油漆厂家_37国际化工 | 温州富欧金属封头-不锈钢封头厂家| 防火窗_耐火窗_防火门厂家_防火卷帘门-重庆三乐门业有限公司 | 胶辊硫化罐_胶鞋硫化罐_硫化罐厂家-山东鑫泰鑫智能装备有限公司 意大利Frascold/富士豪压缩机_富士豪半封闭压缩机_富士豪活塞压缩机_富士豪螺杆压缩机 | 智慧农业|农业物联网|现代农业物联网-托普云农物联网官方网站 | 电磁辐射仪-电磁辐射检测仪-pm2.5检测仪-多功能射线检测仪-上海何亦仪器仪表有限公司 | 化工ERP软件_化工新材料ERP系统_化工新材料MES软件_MES系统-广东顺景软件科技有限公司 | 刑事律师_深圳著名刑事辩护律师_王平聚【清华博士|刑法教授】 |