这里我主要是想分析下这里怎么实现多个数据在页面之间传递。这里要运用到是因为在会员确定要购买物品时候我们会生成一个清单供会员确定,而这里的信息是由上个页面传递过来的,如果用url传递恐怕不太合适。这里采用了一种新的的方法。还记得在电子商务之数据存储流程(五)我们有些页面是继承的BasePage类,而不是System.Web.UI.Page类。这里BasePage类是我们编写的,它也是继承了System.Web.UI.Page类,代码如下

Code
using System;
using System.Data;
using System.Configuration;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;
using Shop.Common;

/// <summary>
///BasePage 的摘要说明
/// </summary>
public class BasePage:System.Web.UI.Page
{

internal const string KEY_CURRENTUSER = "Current Logged In User";
    internal const string KEY_CURRENTORDER = "Current Order";

public BasePage()
    {
    }

public OrdersEntity CurrentOrder
    {
        get
        {
            try
            {
                return (OrdersEntity)(Session[KEY_CURRENTORDER]);
            }
            catch
            {
                return (null);  // for design time
            }
        }

set
        {
            if (value == null)
            {
                Session.Remove(KEY_CURRENTORDER);
            }
            else
            {
                Session[KEY_CURRENTORDER] = value;
            }
        }
    }

public EndUserEntity CurrentEndUser
    {
        get
        {
            try
            {
                return (EndUserEntity)(Session[KEY_CURRENTUSER]);
            }
            catch
            {
                return (null);  // for design time
            }
        }

set
        {
            if (value == null)
            {
                Session.Remove(KEY_CURRENTUSER);
            }
            else
            {
                Session[KEY_CURRENTUSER] = value;
            }
        }
    }
}

可以看出来实质是将数据存储在session中。例如我们在登录界面中可以将得到EndUser存储到base.CurrentEndUser

在从另外一个页面类读取base.CurrentEndUser即可。

另外说明下当游客结账变为会员的步骤,学习灵活的利用Cookies存储URL

当我们点击结账按钮会发生:

    protected void commandCheckout_Click(object sender, EventArgs e)
    {
        Response.Cookies["ReturnURL"].Value = "CheckOut.aspx";
        Response.Redirect("Login.aspx");
    }

当我们登录成功会发生:

Code
protected void commandLogin_Click( object sender , EventArgs e )
{
//所有控件都得到验证
if ( IsValid )
{
        EndUserEntity enduser = new EndUserEntity();
    ProcessEndUserLogin processlogin = new ProcessEndUserLogin();

enduser.UserContactInformation.Email = textUsername.Text;
    enduser.Password                 = textPassword.Text;
    processlogin.EndUser = enduser;

try
    {
        processlogin.Invoke();
    }
    catch
    {
        Response.Redirect( "ErrorPage.aspx" );
    }

//验证成功是会员
    if ( processlogin.IsAuthenticated )
    {
        Response.Cookies["Authenticated"].Value = "True";

//存入到session中去
        base.CurrentEndUser = processlogin.EndUser;

//如果用户是强制转过来登录此刻就让他返回原来的页面
        if ( Request.Cookies["ReturnURL"] != null )
        {
            Response.Redirect( Request.Cookies["ReturnURL"].Value );
        }
                 //就返回到默认的页面,也就是用户订单界面
        else
        {
            Response.Redirect("Account/CustomerOrders.aspx");
        }
    }
    else
    {
        labelMessage.Text = "Invalid login!";
    }
}

这里还分析一下它使用GridView的方法,不像我们平时那样,在每一行添加一个选择,删除,更新命名字段

代码

<asp:GridView ID="gvwBigKind" runat="server" AutoGenerateColumns="False" OnRowEditing="gvwBigKind_RowEditing"
            OnRowUpdating="gvwBigKind_RowUpdating" OnRowCancelingEdit="gvwBigKind_RowCancelingEdit"
            OnRowDeleting="gvwBigKind_RowDeleting" OnSelectedIndexChanging="gvwBigKind_SelectedIndexChanging">
            <Columns>
                <asp:CommandField HeaderText="编辑" ShowEditButton="True" ShowHeader="True" />
                <asp:CommandField HeaderText="选择" ShowSelectButton="True" />
                <asp:CommandField HeaderText="删除" ShowDeleteButton="True" 
                DeleteText="&lt;div id=&quot;de&quot; οnclick=&quot;JavaScript:return confirm('确定删除吗?')&quot;&gt;删除&lt;/div&gt; " />
                <asp:BoundField DataField="总类型编号" HeaderText="总类型编号" ReadOnly="true" />
                <asp:BoundField DataField="总类型名称" HeaderText="总类型名称" />
            </Columns>
        </asp:GridView>

  这里没有在每一行开头给出编辑,删除按钮,却能完成上面的功能

代码

<asp:GridView ID="gridviewShoppingCart" runat="server" AutoGenerateColumns="false" DataKeyNames="Quantity,ShoppingCartID"
                    OnRowDataBound="gridviewShoppingCart_RowDataBound" Width="100%" BorderWidth="0px" CellPadding="2" ShowHeader="false">
                <Columns>
                <asp:TemplateField ItemStyle-Width="16%" ItemStyle-HorizontalAlign="center">
                    <ItemTemplate>
                        <asp:CheckBox ID="checkboxDelete" runat="server" />
                    </ItemTemplate>
                </asp:TemplateField>
                <asp:TemplateField ItemStyle-Width="30%">
                    <ItemTemplate>
                        <%# Eval("ProductName") %>
                    </ItemTemplate>
                </asp:TemplateField>
                <asp:TemplateField ItemStyle-Width="17%" ItemStyle-HorizontalAlign="center">
                    <ItemTemplate>
                        <asp:TextBox id="textQuantity" runat="server" Columns="4" MaxLength="3" Text='<%# Eval("Quantity") %>' width="30px" CssClass="textfield" />
                    </ItemTemplate>
                </asp:TemplateField>
                <asp:TemplateField ItemStyle-Width="18%" ItemStyle-HorizontalAlign="center">
                    <ItemTemplate>
                        <%# Eval( "UnitPrice" , "{0:c}" )%>
                    </ItemTemplate>
                </asp:TemplateField>
                <asp:TemplateField ItemStyle-Width="19%" ItemStyle-HorizontalAlign="center">
                    <ItemTemplate>
                        <%# Eval( "TotalPrice" , "{0:c}" )%>
                    </ItemTemplate>
                </asp:TemplateField>
                </Columns>
                </asp:GridView>

还加上一个更新按钮,这里在GridView中checkbox打上勾的不会立即删除,而是点击更新按钮之后会更新。如果要改变商品数量直接重新输入在点击更新即可

代码

    /// <summary>
    ///  通过循环来更新购物车
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    protected void commandUpdate_Click(object sender, EventArgs e)
    {
        foreach (GridViewRow row in gridviewShoppingCart.Rows)
        {
            if (row.RowType == DataControlRowType.DataRow)
            {
                DataKey data = gridviewShoppingCart.DataKeys[row.DataItemIndex];

CheckBox check = (CheckBox)row.FindControl("checkboxDelete");

if (check.Checked)
                {
                    Delete(int.Parse(data.Values["ShoppingCartID"].ToString()));
                }

TextBox textNewQuantity = (TextBox)row.FindControl("textQuantity");
                int integerNewQuantity = int.Parse(textNewQuantity.Text);

//这里可以获得原来
                int integerOrigQuantity = int.Parse(gridviewShoppingCart.DataKeys[row.DataItemIndex].Value.ToString());

//数量不相等证明购物车中商品数量改变了,就要实行刷新
                if (integerNewQuantity != integerOrigQuantity)
                {
                    Update(int.Parse(data.Values["ShoppingCartID"].ToString()), integerNewQuantity);
                }
            }
        }

//重新绑定数据
        LoadShoppingCart();
    }

private void Update(int id, int newqty)
    {
        ProcessUpdateShoppingCart processupdate = new ProcessUpdateShoppingCart();

ShoppingCartEntity shoppingcart = new ShoppingCartEntity();
        shoppingcart.Quantity = newqty;
        shoppingcart.ShoppingCartID = id;
        processupdate.ShoppingCart = shoppingcart;

try
        {
            processupdate.Invoke();
        }
        catch
        {
            Response.Redirect("ErrorPage.aspx");
        }
    }

private void Delete(int id)
    {
        ProcessDeleteShoppingCart processdelete = new ProcessDeleteShoppingCart();

ShoppingCartEntity shoppingcart = new ShoppingCartEntity();
        shoppingcart.ShoppingCartID = id;
        processdelete.ShoppingCart = shoppingcart;

try
        {
            processdelete.Invoke();
        }
        catch
        {
            Response.Redirect("ErrorPage.aspx");
        }
    }

  这个电子商务系统就分析到这里吧。如果需要原书中代码可以点击这里下载

  另外需要注明自己在随笔中修改书中多代码,并删掉了支付这一段。

电子商务之表示层分析(九)相关推荐

  1. 电子商务之数据库分析(二)

    电子商务之数据库分析(二) 在分析数据库之前,我想倡导大家说说自己开发数据库时应用的工具,erwin?Powerdesiger?or Wrod?或者有更好的,我自己用的是Powerdesiger,但是 ...

  2. 2022-2028年中国电子商务行业市场深度分析及投资前景展望报告

    本研究报告数据主要采用国家统计数据,海关总署,问卷调查数据,商务部采集数据等数据库.其中宏观经济数据主要来自国家统计局,部分行业统计数据主要来自国家统计局及市场调研数据,企业数据主要来自于国统计局规模 ...

  3. 2022-2027年中国B2C电子商务行业市场深度分析及投资战略规划报告

    [报告类型]产业研究 [报告格式]电子版.纸介版 [出品单位]华经产业研究院 本报告由华经产业研究院出品,对中国B2C电子商务行业的发展现状.竞争格局及市场供需形势进行了具体分析,并从行业的政策环境. ...

  4. linux IIC子系统分析(九)——实例分析通过设备节点访问I2c设备

    在< linux IIC子系统分析(四)--I2c bus初始化> 中我们创建了I2C 总线驱动,I2C adapter device 和adapter drivers也在这时创建 在&l ...

  5. 企业电子商务网站策划分析

    网站的成功与否与建站前是否有一个好的网站策划书(网站策划方案)有着极为重要的关系.网站策划书中应明确建设网站的目的,确定网站的功能,确定网站规模.投入费用,进行必要的市场分析等.只有详细的策划,才能避 ...

  6. 电子商务业务模块分析和介绍以及开发流程

    电子商务 电子商务是指以信息网络技术为手段,以商品交换为中心的商务活动:也可理解为在互联网.企业内部网和增值网上以电子交易方式进行交易活动和相关服务的活动,是传统商业活动各环节的电子化.网络化.信息化 ...

  7. 佐丹奴公司电子商务整合案例分析

    在国内服装业,佐丹奴做电子商务有口皆碑.与无店铺的直销类服装电子商务模式相比,佐丹奴的电子商务模式采用了与国内770家门店混合交互的策略,线上线下紧密互动.这个策略令佐丹奴得以低成本地借助传统渠道的优 ...

  8. 电子商务网站如何分析竞争对手的网站?

     提要:在做网络营销时,分析竞争对手是商业竞争中很重要的一个环节.作为电子商务经营的平台,竞争对手的网站,当然也是需要重点分析的.那么如何对竞争对手的网站进行分析呢?在这里分享一些经验! 1.研究网站 ...

  9. jquery 源码分析九 - Sizzle

    最近一直在搞毕设,实在是没时间写博客了,零碎的时间看代码进度也不快,所以写博客一拖再拖了,今天先补一篇上来... 在上次写得setDocument以后,紧接着的是一些零碎的功能函数 1 Sizzle. ...

最新文章

  1. golang实现生产者和消费者
  2. [GYM 100492A] Average Convex Hull 凸包好题
  3. python apply_async函数_Python-未调用apply_async回调函数
  4. pytorch torch.norm(input, p=2) → float、torch.norm(input, p, dim, out=None) → Tensor(求范数)
  5. 腾讯视频vip会员_腾讯视频如何查看版本号
  6. ssh自动登陆和scp自动拷贝文件
  7. 基于Springboot的旅游管理系统
  8. 吉林大学超星学习通04
  9. c语言除法保留1位小数,高精度除法小数点位数
  10. 无法启动此程序因为计算机中丢失d3dx,无法启动此程序,因此计算机中丢失d3dx9-41.dll怎么解决?...
  11. html如何制作图片蒙版,如何制作遮罩蒙版手机照片?详细图文教程
  12. EXCEL使用技巧大全:输入的技巧
  13. CentOS6.x安装方法超详细教程
  14. C语言pixel函数小程序,C语言 getpixel()用法及代码示例
  15. Firefox人气火红 能否取代龙头IE?
  16. mac 重命名文件快捷键
  17. python学习实验报告(第十周)
  18. 网页铺满全屏,不需滚动条的设置方法
  19. 大治河西枢纽二线船闸总体设计(水利设计资料)
  20. 第 11 场双周赛-5089. 安排会议日程(双指针)

热门文章

  1. java中static、final、static final的区别
  2. thinkphp5 404 file_put_contents 无法打开流:权限被拒绝
  3. JVM学习笔记(一)------的基本结构
  4. [Openwrt 项目开发笔记]:Samba服务vsFTP服务(四)
  5. 构建一个基本的前端自动化开发环境 —— 基于 Gulp 的前端集成解决方案(四)
  6. 解决eclipse Run启动或Debug时Console控制台不自动弹出问题
  7. python 实现异常退出
  8. layui表格点击排序按钮后,表格绑定事件失效解决方法
  9. 安装node-sass时出现的错误解决方案(Mac自用,也可以借鉴)
  10. Android判断软键盘弹出并隐藏的简单完美解决方案