购物车: 和淘宝上的购物车类似,就是选择商品点击购买存入购物车,在购物车里查看可以看到所购买物品的详细信息,包括名称,价格,数量,以及总价,至于后面的提交订单后的功能还没实现。
模拟的就是采用Session来控制购物车的状态, 每次点击购买或者显示主界面的时候都要判断 Session的状态,操作Session就是操作订单集合。
如果Session为null,那么就需要为Session造一个空的订单集合,以此来往购物车里放订单的数据;
如果Session的值不为空,那么每点击一下购买便将OrderDetails对象存进订单集合里面。
下面开始显示代码:(前提:由于订单表里只有水果编号和数量,而没有水果名称和价格,所以需要扩展订单表里的属性,为订单表增加一个水果名称和水果价格的属性,是通过订单表里的订单编号和水果表的水果编号相对比来实现的)
1、Models namespace 购物车.Models { public class FruitBF { private MyDBDataContext _context = new MyDBDataContext(); public List<Fruit> Selcet() //水果全部查询出来 { return _context.Fruit.ToList(); } } } 开始扩展订单表的属性: using System; using System.Collections.Generic; using System.Linq; using System.Web; namespace 购物车.Models { public partial class OrderDetails //扩展一下订单表类的属性 { private MyDBDataContext _context = new MyDBDataContext(); //下面开始定义新的属性 private string _FruitName; public string FruitName //定义订单表的水果名字这个属性 { get { var query = _context.Fruit.Where(p => p.Ids == this.FruitCode); //找到水果表里的Ids和输入的水果编号相同的那个对象 if (query.Count() > 0) { return query.First().Name; //返回这个对象的Name属性 } return ""; } } private decimal _FruitPrice; public decimal FruitPrice//定义订单表的水果价格这个属性 { get { var query = _context.Fruit.Where(p => p.Ids == this.FruitCode); //找到水果表里的Ids和输入的水果编号相同的那个对象 if (query.Count() > 0) { return query.First().Price.Value; //返回这个对象的Price属性 } return 0; } } } } 2、Controllers 红色 代表的是每次都要判断Session的状态 using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Mvc; using 购物车.Models; namespace 购物车.Controllers { public class HomeController : Controller { // // GET: /Home/ public ActionResult Index() { //判断一下购物车的状态 if (Session["cart"] == null) //如果购物车里面为空 { ViewBag.Count = 0; //购买的数量便为0 } else //如果不为空 { //用Session来存放数量 List<OrderDetails> temp = Session["cart"] as List<OrderDetails>;//看看Session里面有多少个数据 ViewBag.Count = temp.Count;//购买的数量便是Session里面的数据 } List<Fruit> list= new FruitBF().Selcet(); return View(list); } public ActionResult Buy(string id) //购买的动作 { //下面开始判断一下购物车的状态 if(Session["cart"]==null) //如果购物车是空的 { //造一个新的Datails集合来存放数量 List<OrderDetails> temp = new List<OrderDetails>(); Session["cart"] = temp; //给Session赋值,这时候是空的 } //不是空的话,就直接利用Session里的数据 List<OrderDetails> list = Session["cart"] as List<OrderDetails>; //操作Session就是操作订单集合 //点击一下购买,那么Session便存了一个信息,然后放到了订单集合里面 //下面开始根据传进来的物品的Id来判断是否已经购买过 var query = list.Where(P=>P.FruitCode==id); if (query.Count() <= 0) //这证明以前没有买过 { //既然没买过,就要造一个新的存进Session里面去 OrderDetails data = new OrderDetails(); data.FruitCode = id;//购买的物品的ID就是传过来的Id data.Count = 1;//购买的数量等于1 list.Add(data);//将购买的加进订单的集合里面 也就是Session里面 } else//如果之前买过,只需要再数量上++就可以了 { OrderDetails data = query.First();//这是根据传进来的Id查到的所购买的物品 data.Count++; //数量++ } return RedirectToAction("Index","Home"); } //下面开始写查看购物车的动作 (前提:购物车里面只有订单号和数量而没有水果名字和价格,所以需要扩展一下订单的类) public ActionResult Cart() //查看购物车 { //判断一下购物车的状态 if (Session["cart"] == null) //如果是空的,就给Session赋一个空的订单 { List<OrderDetails> temp = new List<OrderDetails>(); //造一个新的订单集合 Session["cart"] = temp;//给Session赋值 空的订单 } //如果购物车不是空的,那么订单就是Session List<OrderDetails> list = Session["cart"] as List<OrderDetails>; //点击一下购买,那么Session便存了一个信息,然后放到了订单集合里面 //获取一下消费了多少钱,消费的钱=购买的数量*商品的单价 decimal cost = list.Sum(P => P.Count * P.FruitPrice).Value;//通过订单集合里的Sum函数来计算(公式为价格*数量) ViewBag.cost=cost; return View(list); } //如果多买了数量,就需要删除,下面开始写删除的 public ActionResult RemoveCartCount(string id) { //下面开始判断一下购物车的状态 if (Session["cart"] == null) //如果购物车是空的 { //造一个新的Datails集合来存放数量 List<OrderDetails> temp = new List<OrderDetails>(); Session["cart"] = temp; //给Session赋值,这时候是空的 } //不是空的话,就直接利用Session里的数据 List<OrderDetails> list = Session["cart"] as List<OrderDetails>; //操作Session就是操作订单集合 //点击一下购买,那么Session便存了一个信息,然后放到了订单集合里面 var query = list.Where(P=>P.FruitCode==id); //找到订单里面那个编号等于传过来的Id的那个对象 if (query.Count()>0) //如果查出来的数量大于0 { OrderDetails data = query.First();//查出来的第一个对象 //下面开始判断这个对象的数量 if (data.Count >1) //如果数量大于1,只需要把数量--就行了 { data.Count--; } else //如果数量小于1了,需要把这条订单从订单集合里删掉 { list.Remove(data); //把这条订单从订单集合里删掉 } return RedirectToAction("Cart","Home");//返回到购物车的动作上 } else { return RedirectToAction("Cart", "Home");//返回到购物车的动作上 } } } } 3、Views Index: @{ Layout = null; } @using 购物车.Models; @model List<Fruit> <!DOCTYPE html> <html> <head> <meta name="viewport" content="width=device-width" /> <title>Index</title> <style> .aa { position:relative; margin:auto; 300px; height:300px; } </style> </head> <body> <div class="aa" > @foreach(Fruit data in Model) { <ul> <li>@data.Name (@data.Price) @data.Numbers @Html.ActionLink("购买", "Buy", new { id=data.Ids})</li> </ul> } @{ int Count = (int)ViewBag.Count; } <div> 您当前购买了 @Count 个商品 </div> @Html.ActionLink("查看购物车","Cart") </div> </body> </html> Cart: @{ Layout = null; } @using 购物车.Models; @model List<OrderDetails> <!DOCTYPE html> <html> <head> <meta name="viewport" content="width=device-width" /> <title>Cart</title> </head> <body> <div> <h1>查看购物车</h1> @foreach (OrderDetails data in Model) //因为订单表里没有水果的名字和价格,所以需要扩展一下订单的类 { <ul> <li>名称:@data.FruitName (价格: @data.FruitPrice 元) 数量:@data.Count 个 @Html.ActionLink("删除", "RemoveCartCount", new { id=data.FruitCode},null)</li> </ul> } 您本次总共消费了 <font color="red"> @ViewBag.cost </font> 元 </div> </body> </html>
效果图: