购物车主要实现的功能:

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

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

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

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

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

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

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

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

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

先创建一个母版页:

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

    题目链接:http://lightoj.com/volume_showproblem.php?problem=1337 思路:对于搜过的区域进行标记,如果要求的点落在已经搜过的区域,那么直接取出来即可 ...

  2. Linux学习笔记(7)Linux常用命令之压缩解压命令

    (1)gzip gzip命令用于压缩文件,英文原意为GNU zip,所在路径/bin/gzip,其语法格式为: gzip [文件] 压缩后的文件格式为.gz. 例:将/etc目录下的services文 ...

  3. 【spring set注入 注入集合】 使用set注入的方式注入List集合和Map集合/将一个bean注入另一个Bean

    Dao层代码: package com.it.dao; public interface SayHell { public void sayHello(); } Dao的Impl实现层: packag ...

  4. DSP using MATLAB 示例Example3.22

    代码: % Discrete-time Signal x2(n) Ts = 0.001; n = -5:1:5; nTs = n*Ts; Fs = 1/Ts; x = exp(-1000*abs(nT ...

  5. 【主席树】【bzoj2161】[hdu4348]

    #include<cstdio> #include<algorithm> #include<cstring> #define N 400000 using name ...

  6. C# 词法分析器(七)总结

    系列导航 (一)词法分析介绍 (二)输入缓冲和代码定位 (三)正则表达式 (四)构造 NFA (五)转换 DFA (六)构造词法分析器 (七)总结 在之前的六篇文章中,我比较详细的介绍了与词法分析器相 ...

  7. DOM基础3

    隔行变色 <!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF- ...

  8. ccc 设置图片位置

    cc.Class({ extends: cc.Component, properties: { player:{ default:null, type:cc.Sprite } }, // use th ...

  9. HDU 1072(记忆化BFS)

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1072 题目大意:走迷宫.走到装置点重置时间,到达任一点时的时间不能为0,可以走重复路,求出迷宫最短时 ...

  10. ACM:POJ 2739 Sum of Consecutive Prime Numbers-素数打表-尺取法

    POJ 2739 Sum of Consecutive Prime Numbers Time Limit:1000MS     Memory Limit:65536KB     64bit IO Fo ...