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