购物车: 和淘宝上的购物车类似,就是选择商品点击购买存入购物车,在购物车里查看可以看到所购买物品的详细信息,包括名称,价格,数量,以及总价,至于后面的提交订单后的功能还没实现。

 

  模拟的就是采用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;
            width: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>

 

效果图:

购物车可以直接存放入redis 购物车可以采用session实现_System

 

购物车可以直接存放入redis 购物车可以采用session实现_html_02

 

购物车可以直接存放入redis 购物车可以采用session实现_购物车可以直接存放入redis_03

 

购物车可以直接存放入redis 购物车可以采用session实现_html_04