购物车主要实现的功能:

①在主页面可以将所有商品显示出来,包括价格,库存。

②点击购买可以累加产品,如果是同一种产品,只会累加每种产品的数量。

③查看购物车,可以查看明细,包括所购物品的名称,价格,数量等等。

  ④查看账户,显示账户余额。

⑤在购物车中可以下订单,当点击下订单的时候,需要判断是否已经登录,如果没有登录,则跳到登录页面。

⑥下订单之后,客户的余额减少幅度等于所消费幅度。

  ⑦余额不足,提示;库存不足,提示;购物车清空。

⑧库存产品数量减少,减少的每种产品的数量等于购买的每种产品的数量。

下面用代码来详细介绍一下购物车功能的实现:

先创建一个母版页:

<%@ Master Language="C#" AutoEventWireup="true" CodeFile="MasterPage.master.cs" Inherits="MasterPage" %>

<!DOCTYPE html>

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<title></title>
<asp:ContentPlaceHolder id="head" runat="server">
</asp:ContentPlaceHolder>
</head>
<body>
<form id="form1" runat="server">
<div style="background-color:#6aa3e1;">
<div style="font-size:30px; color:#fff; font-family:微软雅黑;margin-top:20px;">
   
<asp:Label ID="Label1" runat="server" Text="大苹果购物网" ></asp:Label>
</div> <div style=" width:100%;height:25px;font-size:20px; color:#ff00dc;">
<a href="Login.aspx" style="float:right;margin-right:15px;">登录</a>
</div> <div style="width:100%;height:360px">
<div style="width:20%;height:360px; float:left;">
<div style="margin-top:110px; text-align:center; font-size:20px;">
<asp:LinkButton ID="LinkButton1" runat="server" OnClick="LinkButton1_Click1">浏览商品</asp:LinkButton>
</div>
<div style="margin-top:20px; text-align:center; font-size:20px;">
<asp:LinkButton ID="LinkButton2" runat="server" OnClick="LinkButton2_Click">查看账户</asp:LinkButton>
</div>
<div style="margin-top:20px; text-align:center; font-size:20px;">
<asp:LinkButton ID="LinkButton3" runat="server" OnClick="LinkButton3_Click">查看购物车</asp:LinkButton>
</div>
</div>
<div style="width:80%;height:360px; float:left;background-color:#fff;">
<asp:ContentPlaceHolder id="ContentPlaceHolder1" runat="server"> </asp:ContentPlaceHolder>
</div>
</div>
<div style="width:100%;height:40px;text-align:center;line-height:40px;">
汉企教育科技出品
</div>
</div>
</form>
</body>
</html>

实现用户登录功能:

Login.aspx

<%@ Page Title="" Language="C#" MasterPageFile="~/MasterPage.master" AutoEventWireup="true" CodeFile="Login.aspx.cs" Inherits="_Default" %>

<asp:Content ID="Content1" ContentPlaceHolderID="head" Runat="Server">
</asp:Content>
<asp:Content ID="Content2" ContentPlaceHolderID="ContentPlaceHolder1" Runat="Server">
            <div style="width:50%;text-align:center">
                        <div style="height:45px;background:#4256f2;">
                            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<asp:Label ID="Label2" runat="server" Font-Names="微软雅黑" Font-Size="XX-Large" ForeColor="White" Text="登    录" ></asp:Label>
                        </div>
                        <div style="height:315px;background:#7e8ae5">
                            <br />
                            <br />
                            <br />
                            <asp:Label ID="Label3" runat="server" Text="用户名:" Font-Size="Larger"></asp:Label>
                            <asp:TextBox ID="txtuid" runat="server" Font-Size="Large" Width="185px"></asp:TextBox>
                            <br />
                            <br />
                            <br />
                            <asp:Label ID="Label4" runat="server" Text="密码:" Font-Size="Larger"></asp:Label>
&nbsp;
                            <asp:TextBox ID="txtpwd" runat="server" Font-Size="Large" Width="185px" TextMode="Password"></asp:TextBox>
                            <br />
                            <br />
                            <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<asp:Button ID="Button1" runat="server" Font-Size="Larger" Text="登录" OnClick="Button1_Click" />
                            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
                            <br />
                            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
                            <br />
                        </div>
        </div>
</asp:Content>

Login.aspx.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls; public partial class _Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
bool isok = new FruitDA().checkUser(txtuid.Text, txtpwd.Text);
if (isok)
{
Session["uid"] = txtuid.Text;
Response.Redirect("Index.aspx?user=" + txtuid.Text);//跳转页面 }
}
protected void Button1_Click(object sender, EventArgs e)
{ }
}

Index页面,实现功能①,显示所有物品。

Index.aspx代码:

<%@ Page Title="" Language="C#" MasterPageFile="~/MasterPage.master" AutoEventWireup="true" CodeFile="Index.aspx.cs" Inherits="Index" %>

<asp:Content ID="Content1" ContentPlaceHolderID="head" Runat="Server">
</asp:Content>
<asp:Content ID="Content2" ContentPlaceHolderID="ContentPlaceHolder1" Runat="Server">
    <asp:Literal ID="Literal1" runat="server"></asp:Literal>
    <asp:Repeater ID="Repeater1" runat="server" OnItemCommand="Repeater1_ItemCommand">
        <HeaderTemplate>
            <table style="width:100%; height:70%; text-align:center; background:#000000" >
                 <tr style=" color:#fff;">
                                <td>代号</td>
                                <td>水果名称</td>
                                <td>水果价格</td>
                                <td>原产地</td>
                                <td>货架</td>
                                <td>库存量</td>
                                <td></td>
                            </tr>           
        </HeaderTemplate>         <ItemTemplate>
            <tr style="background:#fff">
                                <td><%#Eval("ids") %></td>
                                <td><%#Eval("name") %></td>
                                <td><%#Eval("price") %></td>
                                <td><%#Eval("source") %></td>
                                <td><%#Eval("stack") %></td>
                                <td><%#Eval("numbers") %></td>
                                <td><asp:LinkButton ID="LinkButton1" CommandName="buy" CommandArgument='<%#Eval("ids") %>' runat="server">购买</asp:LinkButton></td>
                            </tr>
        </ItemTemplate>         <FooterTemplate>
            </table>
        </FooterTemplate>
    </asp:Repeater>
</asp:Content>

实现功能②,点击购买时,存放在session[]里面

Index.aspx.cs代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls; public partial class Index : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            Repeater1.DataSource = new FruitDA().select();
            Repeater1.DataBind();
        }
    }
    protected void Repeater1_ItemCommand(object source, RepeaterCommandEventArgs e)
    {
        if (e.CommandName == "buy")  //通过commandname区分点击的是购买按钮
        {
            string ids = e.CommandArgument.ToString();
            if (Session["list"] != null)
            {
                List<Fruit> slist = (List<Fruit>)Session["list"];
                int count = 0;  //标记变量,判断购物车中有没有选中的商品
                foreach(Fruit data in slist)
                {
                    if (ids == data.Ids)    //购物车中存在选中的商品
                    {
                        data.Numbers += 1;//存在的商品数量+1
                        count++;
                    }
                }
                if (count == 0)//购物车中不存在选中的商品
                {
                    Fruit data = new FruitDA().selectbyids(ids);
                    data.Numbers = 1;   //购物车中选中的商品数量为1
                    slist.Add(data);
                    Session["list"] = slist;
                }
            }
            else  //购物车中一件商品也没有
            {
                List<Fruit> list = new List<Fruit>();
                Fruit data = new FruitDA().selectbyids(ids);
                data.Numbers = 1;
                list.Add(data);
                Session["list"] = list;
            }
            //计算购物车商品数量及总价
            if(Session["list"] != null)
            {
                List<Fruit> list = (List<Fruit>)Session["list"];
                decimal sum = 0;
                foreach(Fruit data in list)
                {
                    sum += (decimal)(data.Numbers * data.Price);
                }
                 Literal1.Text = "购物车中有 "+list.Count+" 件商品,总价为 "+sum+" 元";
            }         }
    }
}

实现功能③,查看购物车

ViewCart.aspx代码:

<%@ Page Title="" Language="C#" MasterPageFile="~/MasterPage.master" AutoEventWireup="true" CodeFile="ViewCart.aspx.cs" Inherits="_Default" %>

<asp:Content ID="Content1" ContentPlaceHolderID="head" Runat="Server">
</asp:Content>
<asp:Content ID="Content2" ContentPlaceHolderID="ContentPlaceHolder1" Runat="Server">
    <div>
        <asp:Literal ID="Literal2" runat="server"></asp:Literal>
    </div>
    <div style="width:640px;height:200px;">
    <asp:Repeater ID="Repeater1" runat="server" OnItemCommand="Repeater1_ItemCommand">
        <HeaderTemplate>
            <table style="width:600px; text-align:center; background:#000000">
                 <tr style=" color:#fff;">
                                <td>代号</td>
                                <td>商品名称</td>
                                <td>商品价格</td>
                                <td>购买数量</td>
                                <td></td>
                            </tr>           
        </HeaderTemplate>

<ItemTemplate>
            <tr style="background:#fff">
                                <td><%#Eval("ids") %></td>
                                <td><%#Eval("name") %></td>
                                <td><%#Eval("price") %></td>
                                <td><%#Eval("numbers") %></td>
                                <td><asp:LinkButton ID="LinkButton1" CommandName="delete" CommandArgument='<%#Eval("ids") %>' runat="server">删除</asp:LinkButton></td>
                            </tr>
        </ItemTemplate>
        <FooterTemplate>
            </table>
        </FooterTemplate>
    </asp:Repeater>
        </div>
        <div style="width:600px;height:50px;">
            <asp:Literal ID="Literal1" runat="server"></asp:Literal><br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
            <asp:LinkButton ID="LinkButton2" runat="server" OnClick="LinkButton2_Click">提交订单</asp:LinkButton>
            <br />
        </div>
</asp:Content>

实现功能⑤⑥⑦⑧,点击购买时,存放在session[]里面

ViewCart.aspx.cs代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls; public partial class _Default : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            if (Session["list"] != null)
            {
                Repeater1.DataSource = (List<Fruit>)Session["list"];//里氏转换,购物车的表存在session中
                Repeater1.DataBind();
            }
            else
            {
                Literal2.Text = "购物车中没有任何商品!";
            }
        }
    }
    protected void Repeater1_ItemCommand(object source, RepeaterCommandEventArgs e)
    {
        if (e.CommandName == "delete")  //删除按钮
        {
            string ids = e.CommandArgument.ToString();
            List<Fruit> list = (List<Fruit>)Session["list"];
            Fruit sdata = null; //做标记
            foreach (Fruit data in list)
            {
                if (ids == data.Ids)//找到商品
                {
                    if (data.Numbers > 1)//如果商品数量大于1
                    {
                        data.Numbers -= 1;
                    }
                    else//否则数量等于1
                    {
                        sdata = data;
                    }
                }
            }
            if (sdata != null)
            {
                list.Remove(sdata);//直接移除商品
            }
            Session["list"] = list;
            Repeater1.DataSource = (List<Fruit>)Session["list"];//重新绑定数据
            Repeater1.DataBind();
        }
    }     //先验证库存是否足够,用户是否登陆,当二者都满足时,然后在进数据库执行删除
    protected void LinkButton2_Click(object sender, EventArgs e)
    {         List<Fruit> list = (List<Fruit>)Session["list"];
        bool isok = true;
        foreach (Fruit data in list)
        {
            var s1 = data.Numbers;
            var s2 = new FruitDA().selectbyids(data.Ids).Numbers;
            if (s1 < s2)//判断购买的数量和库存数量
            {
                isok = true;
            }
            else
            {
                isok = false;
                string name = new FruitDA().selectbyids(data.Ids).Name;
                Literal1.Text = name + "的库存不足!";
            }
        }
        //如果库存满足,再进行验证用户是否登录
        if (isok)
        {
            //如果用户登录成功,再判断该用户的余额是否满足购买商品的总额
            if (Session["uid"] != null)
            {
                string uid = Session["uid"].ToString();
                var yu = new FruitDA().selectuser(uid).Account;//用户的余额
                decimal sum = 0;
                foreach (Fruit data in list)
                {
                    sum += (decimal)(data.Numbers * data.Price);//商品的总价
                }
                if (yu >= sum)//余额满足
                {
                    foreach (Fruit sdata in list)//减库存
                    {
                        var s1 = sdata.Numbers;//购买的数量
                        var s2 = new FruitDA().selectbyids(sdata.Ids).Numbers;//库存
                        var s = s2 - s1;
                        Fruit data = new Fruit();
                        data.Ids = sdata.Ids;
                        data.Numbers = s;
                        new FruitDA().update(data);
                    }
                    //减余额
                    var shengyu = yu - sum;
                    Login m = new Login();
                    m.UserName = uid;
                    m.Account = shengyu;
                    new FruitDA().updateyue(m);
                    //添加订单
                    Orders data1 = new Orders();
                    Random r = new Random();
                    string ordercode = DateTime.Now.ToString("yyyyMMddHHmmssms") + r.Next(100).ToString();
                    data1.Code = ordercode;
                    data1.UserName = uid;
                    data1.OrderTime = DateTime.Now;                     new FruitDA().Insert1(data1);                     //添加订单详情表
                    foreach (Fruit data in list)
                    {
                        OrderDetails data2 = new OrderDetails();
                        data2.OrderCode = ordercode;
                        data2.FruitCode = data.Ids;
                        data2.Count = data.Numbers;                         new FruitDA().Insert2(data2);
                    }
                    Literal1.Text = "订单提交成功!";
                }
                else//如果余额不满足,进行提示
                {
                    Literal1.Text = "余额不足!";
                }
            }
            else
            {
                Response.Redirect("Login.aspx");
            }
        }     }
}

实现功能④,查看账户余额

ViewAccount.aspx代码

<%@ Page Title="" Language="C#" MasterPageFile="~/MasterPage.master" AutoEventWireup="true" CodeFile="ViewAccount.aspx.cs" Inherits="_Default" %>

<asp:Content ID="Content1" ContentPlaceHolderID="head" Runat="Server">
</asp:Content>
<asp:Content ID="Content2" ContentPlaceHolderID="ContentPlaceHolder1" Runat="Server">
<asp:Literal ID="Literal1" runat="server"></asp:Literal>
</asp:Content>

ViewAccount.aspx.cs代码

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls; public partial class _Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
if (Session["uid"] != null)
{
string uid = Session["uid"].ToString();
var yu = new FruitDA().selectuser(uid).Account;//用户的余额
Literal1.Text = "您的账户中还剩余 "+yu+" 元";
}
else
{
Response.Redirect("Login.aspx");
}
}
}

Webform购物车(用Session存储,页面传值)的更多相关文章

  1. webform基础介绍及页面传值(session,cookie)、跳转页面

    一,IIS 1.首先知道IIS是个什么东西:它是web服务器软件,安装在服务器上,接受客户端发来的请求,并传送给服务器端,然后响应请求并送回给客户端.类似于饭店里的服务员. 2.会安装IIS——控制面 ...

  2. WebForm 页面传值

    一.使用Querystring Querystring是一种非常简单的传值方式,其缺点就是会把要传送的值显示在浏览器的地址栏中,并且在此方法中不能够传递对象.如果你想传递一个安全性不是那么太重要或者是 ...

  3. webform 页面传值的方法总结

    ASP.NET页面之间传递值的几种方式   页面传值是学习asp.net初期都会面临的一个问题,总的来说有页面传值.存储对象传值.ajax.类.model.表单等.但是一般来说,常用的较简单有Quer ...

  4. webform页面传值和删除修改

    一.webform跨页面传值1.内置对象地址栏数据拼接 QueryString 优点:简单好用:速度快:不消耗服务器内存. 缺点:只能传字符串:保密性差(调转页面后在地址栏显示):长度有限.响应请求对 ...

  5. 【2017-05-21】WebForm跨页面传值取值、C#服务端跳转页面、 Button的OnClientClick属性、Js中getAttribute和超链接点击弹出警示框。

    一.跨页面传值和取值: 1.QueryString - url传值,地址传值 优缺点:不占用服务器内存:保密性差,传递长度有限. 通过跳转页面路径进行传值,方式: href="地址?key= ...

  6. WebForm跨页面传值取值、C#服务端跳转页面、 Button的OnClientClick属性和超链接点击弹出警示框

    一.跨页面传值和取值: 1.QueryString - url传值,地址传值 优缺点:不占用服务器内存:保密性差,传递长度有限. 通过跳转页面路径进行传值方式: href="地址?key=v ...

  7. dotNET5的MVC页面传值方式总结

    本文大致讲解mvc前后端的传值方式,包括control向view.view向control.以及action向action. 一.经典回顾 二.Controller向View传值 1. ViewBag ...

  8. Jetty集群配置Session存储到MySQL、MongoDB

    在Web开发中,Session表示HTTP服务器与客户端(例如浏览器)的“会话”,每个客户端会有其对应的Session保存在服务器端,通常用来保存和客户端关联的一些信息,例如是否登录.购物车等. Se ...

  9. Spring 向页面传值以及接受页面传过来的参数的方式

    来源于:http://www.cnblogs.com/liuhongfeng/p/4802013.html 一.从页面接收参数 Spring MVC接收请求提交的参数值的几种方法: 使用HttpSer ...

  10. ASP.NET页面传值不使用QueryString

    ASP.NET页面传值不使用QueryString   Asp.net中的页面传值方法: 1         Url传值 特点:主要优点是实现起来非常简单,然而它的缺点是传递的值是会显示在浏览器的地址 ...

随机推荐

  1. loj 1316(spfa预处理+状压dp)

    题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=27024 题意:求0-(n-1)的经过最多的标记的点的最短路. 思路 ...

  2. 一个简单的Object Hook的例子(win7 32bit)

    Object Hook简单的来说就是Hook对象,这里拿看雪上的一个例子,因为是在win7 32位上的,有些地方做了些修改. _OBJECT_HEADER: kd> dt _OBJECT_HEA ...

  3. 非正规写法获取不到tr,td

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  4. JAVA多线程实现的四种方式

    Java多线程实现方式主要有四种:继承Thread类.实现Runnable接口.实现Callable接口通过FutureTask包装器来创建Thread线程.使用ExecutorService.Cal ...

  5. Portlet简述

    一.Portlet是什么? Portlet是基于java的web组件,由portlet容器管理,并由容器处理请求,生产动态内容.Portals使用portlets作为可插拔用户接口组件,提供信息系统的 ...

  6. MFC 启动其他程序 变相跳转

    尝试了多种方式之后都无法成功地在对话框程序中弹出一个单文档程序,然后我想到了这个办法. 如果直接在代码中实现某些窗口的弹出比较麻烦,可以采用这个方式来弹出这种窗口. 如果需要传递参数,只需将数据写入文 ...

  7. hive :MetaException(message:Version information not found in metastore. )

    MetaException(message:Version information not found in metastore. ) Hive now records the schema vers ...

  8. IOS之同步请求、异步请求、GET请求、POST请求

    .同步请求可以从因特网请求数据,一旦发送同步请求,程序将停止用户交互,直至服务器返回数据完成,才可以进行下一步操作, .异步请求不会阻塞主线程,而会建立一个新的线程来操作,用户发出异步请求后,依然可以 ...

  9. gulp顺序执行任务

    gulp的任务的执行是异步的. 所以,当我写完一系列的任务,准备一股脑地执行. # gulp.task('prod', ['clean', 'compass', 'image', 'style', ' ...

  10. Android中有关relativeLayout 和EditText的一些属性

      http://www.cnblogs.com/jqyp/archive/2010/10/23/1859182.html RelativeLayout用到的一些重要的属性: 第一类:属性值为true ...