学习PetShop3.0(4)购物车

学习PetShop3.0(4)购物车终于到购物车了,在看这个之前应该已经明白了第三篇的那个模型,这样购物车基本也就明白了。来看一下ShoppingCart.aspx这个页。当你看好了一个宠物,比如可爱的GoldenRetriever,嘿嘿,那就点addtocart按钮,这时就会跳到ShoppingCart.aspx,url里带了这个宠物的id号,根据该id号程序将该宠物放到cart里面。然后你可以再去挑别的宠物,比如一只猫(……

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE稳定放心使用

终于到购物车了,在看这个之前应该已经明白了第三篇的那个模型,这样购物车基本也就明白了。

来看一下ShoppingCart.aspx这个页。

当你看好了一个宠物,比如可爱的Golden Retriever,嘿嘿,那就点add to cart按钮,这时就会跳到ShoppingCart.aspx,url里带了这个宠物的id号,根据该id号程序将该宠物放到cart里面。然后你可以再去挑别的宠物,比如一只猫(……),虽然这不是什么好主意。然后该宠物的id号又会被传到ShoppingCart.aspx,并添加到cart里面。在ShoppingCart.aspx里,你可以更改想要领养的宠物的数量,然后程序会根据你要求的数量来计算所需的钱以及该宠物是否还有剩余。在你做出决定后可以点proceed to checkout进入定单生成的环节。

上面是大体的流程。下面来看.net petshop是怎么实现这个cart的

基本的实现主要是BLL里的Cart和Model里的CartItemInfo,而Web.ProcessFlow的CartControler则负责具体的实现。想一想第三篇里的那个模型,具体到这里,每挑选一个宠物,就有一个CartItemInfo通过CartControler添加到了保存在Session里的Cart里面,最后生成定单的时候就从Session里把Cart的值取出来(CartControler有生成定单的方法,下一篇再说)。

来看一下ShoppingCart.aspx.cs里向Cart添加CartItemInfo的代码

// Create an instance of the cart controller

ProcessFlow.CartController cartController = new ProcessFlow.CartController();

myCart = cartController.GetCart(true);

if (!Page.IsPostBack){

// Get the itemdId from the query string

string itemId = Request[“itemId”];

if (itemId != null){

// Clean the input string

itemId = WebComponents.CleanString.InputText(itemId, 50);

myCart.Add(itemId);

cartController.StoreCart(myCart);

}

}

先看这一句 myCart = cartController.GetCart(true);

GetCart方法用来生成一个Cart,它是先在Session里检查,如Session里没有保存Cart,就生成一个新的,否则就把保存在Session里的Cart取出来,然后使用Add方法把新的宠物加到Cart里。

public Cart GetCart(bool create){

// Fetch the cart object from session state

Cart myCart = (Cart)HttpContext.Current.Session[CART_KEY];

if ( myCart == null ){

if (create){

myCart = new Cart();

}else{ 

HttpContext.Current.Server.Transfer(URL_NOCART);

return null;

}

}

return myCart;

}

下面是Add方法的实现

public void Add(string ItemId) {

// _items是在Cart里保存的宠物集合,通过遍历来判断这是否是一个新类别

foreach (CartItemInfo cartItem in _items) {

if (ItemId == cartItem.ItemId) {

cartItem.Quantity++;

cartItem.InStock = (GetInStock(ItemId) – cartItem.Quantity) >= 0 ? true : false;

_total = _total+(cartItem.Price*cartItem.Quantity);

return;

}

}

//是一个新类别,则把一个CartItemInfo加入Cart,可以在这里看到CartItemInfo的组成

Item item = new Item();

ItemInfo data = item.GetItem(ItemId);

CartItemInfo newItem = new CartItemInfo(ItemId,data.Name, (data.Quantity >= 1), 1, (decimal)data.Price); 

_items.Add(newItem);

_total = _total+(data.Price);

}

这就完成了添加。然后是数量的更改。

// Check for update button

if (e.CommandName == CMD_UPDATE){

TextBox txt;

int qty;

int index;

// Go through each item on the page

for (int i = 0, j = cart.Items.Count; i < j; i++){

// lookup the control

txt = (TextBox)cart.Items[i].FindControl(ID_TXT);

try{

qty = int.Parse(txt.Text);

index = cart.CurrentPageIndex * cart.PageSize + i;

// If the new qty is zero, remove the item from the cart

if (qty <= 0)

myCart.RemoveAt(index); 

// Update the item with the new quantity

else

myCart[index].Quantity = qty;

}

catch {}

}

}else

// otherwise the command is to remove the an item

myCart.Remove((string)e.CommandArgument);

因为宠物的添加是先于数量的更改进行的,所以到了这里Session里肯定有保存Cart。数量的更改直接同过索引器来完成,更改后直接就会保存。Remove和RemoveAt都实现了从Cart删除指定的CartItemInfo。

ShoppingCart.aspx页还有其他的东西,比如一个继承自SimplePager的自定义控件,,还有判断是否显示用户喜好的宠物列表的判断。

Refresh方法用来重新计算total的值,哈,不过我不清楚微软究竟想拿这个值显示什么?在我下的这个版本里,根本就不是subtotla的总和,而是price的总和,但问题在于,当你把一种宠物从Cart里移除的时候,它竟然会total=total-subtotal,因此常常会出现负数……

购物车从开始到最后销毁,都是在和Session打交道,没有任何与数据库的交互。我不是很了解面向对象技术,但我觉得oo在这里得到了很好的体现。

转载于:https://www.cnblogs.com/torome/archive/2005/11/03/268054.html

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/181370.html原文链接:https://javaforall.net

赞 (0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 猴子摘香蕉问题python_硬币找零&&爬楼梯&&猴子摘香蕉「建议收藏」

    猴子摘香蕉问题python_硬币找零&&爬楼梯&&猴子摘香蕉「建议收藏」硬币找零&&爬楼梯&&猴子摘香蕉假设有几种硬币,如1、3、5,并且数量无限。请找出能够组成某个数目的找零所使用最少的硬币数。#include”CoinProblem.h”#includeintcountNum=MAX;voidCoinProblem(int*coin,intLength,intValue,intcount){if(Value==0){if(count…

    2022年9月26日
  • DLL EXE查看工具 Dumpbin.exe

    DLL EXE查看工具 Dumpbin.exe一般情况下,我们需要查看一个DLL或EXE中的包含的函数或是依赖的函数之类的信息,可以使用VS自带的工具dumpbin;  可以直接在命令行下输入dumpbin就可以查看他的使用说明,如果未显示,可以先运行VS安装目录下的vcvarsall.bat来设置一下环境变量就可以了 [cpp] viewplain copyMicr

    2022年6月19日
  • vue 路由嵌套_vue多级路由嵌套

    vue 路由嵌套_vue多级路由嵌套嵌套路由有时候在路由中,主要的部分是相同的,但是下面可能是不同的。比如访问首页,里面有新闻类的/home/news,还有信息类的/home/message。这时候就需要使用到嵌套路由。项目结构如下:

    2022年7月29日
  • hadoop平台搭建_eclipse安卓开发环境搭建

    hadoop平台搭建_eclipse安卓开发环境搭建参看:GettingStartedGuideforDM368DM365LeopardBoard参看:DAVINCIDM365-DM368开发攻略——开发环境搭建(DVSDK4.02)一、下载相应软件包下载:相应软件包二、安装Ubuntu10.04网上教程很多,参看:在VMware虚拟机上安装Ubuntu10.04

    2022年8月13日
  • 【20】进大厂必须掌握的面试题-50个Hadoop面试

    点击上方“全栈程序员社区”,星标公众号 重磅干货,第一时间送达 1.关系数据库和HDFS之间的基本区别是什么? 以下是HDFS和关系数据库之间的主要区别: 类别 关系数据库管理系统…

    2021年6月24日
  • Java贪吃蛇小游戏,我家小AD从小水蛇成长为水中巨蟒![通俗易懂]

    Java贪吃蛇小游戏,我家小AD从小水蛇成长为水中巨蟒![通俗易懂]引言:相信每一个人在童年时都有一个乃至数个伟大的梦想,我小时候就梦想成为:1.孙悟空,因为我想成为一个降妖除魔、72变,最重要的是我想去哪就去哪,一个跟斗就起飞!2.葫芦娃,因为分开时个个独挡一面、身怀绝技;合体时,完美无敌,想大就大、想小就小!3.军事家,我从小比较喜欢看抗日电视剧,感觉我们国家从苦难中走出来很不容易,我那时希望自己成为军事家,能够保卫好我们的国家!4.科学家,老师跟我们说科学家是国家栋梁!我也希望能够成为杰出的科学家,提升我们国家的科技。5.工程师,成为一名优秀的工程师,能建

    2022年6月29日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号