学习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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • charles导致mac无法上网_使用不同的MAC地址上网

    charles导致mac无法上网_使用不同的MAC地址上网前言charles关闭后,发现网页突然打开了,那大概率是设置了代理,但明明已经关闭了charles,这是由于mac网络偏好设置中,使用的是手动代理,将其改为自动即可解决方法1打开网络偏好设置,

    2022年7月28日
    5
  • 42步进电机转速力矩曲线_步进电机的力矩与转速

    42步进电机转速力矩曲线_步进电机的力矩与转速扭矩是指步进电机运转时从输出轴的平均力矩,俗称为步进电机的“转劲”。扭矩越大,步进电机输出的“劲”越大,输出轴转速的变化也越快。扭矩随步进电机转速的变化而不同,转速太高或太低,扭矩都不是最大,只在某个转速时或某个转速区间内才有最大扭矩,这个区间就是在标出最大扭矩时给出的转速或转速区间。最大扭矩一般出现在步进电机的中、低转速的范围,随着转速的提高,扭矩反而会下降。扭矩的单位是牛顿·米(N·m)或公斤…

    2022年5月14日
    109
  • 卡方检验spss步骤_数据分析–学统计&amp;SPSS操作

    卡方检验spss步骤_数据分析–学统计&amp;SPSS操作笔记内容来源:拉勾教育数据分析实战训练营我是一个在教育留学行业8年的老兵,受疫情的影响留学行业受挫严重,让我也不得不积极寻找新的职业出路。虽然我本身是留学行业,但对数据分析一直有浓厚的兴趣,日常工作中也会做一些数据的复盘分析项目。加上我在留学行业对于各专业的通透了解,自2016年起,在各国新兴的专业–商业分析、数据科学都是基于大数据分析的专业,受到留学生的火爆欢迎,可见各行各业对于数据分析的人才…

    2022年5月13日
    154
  • 独立编址,统一编址,IO端口,IO内存,冯·诺伊曼,哈佛结构

    独立编址,统一编址,IO端口,IO内存,冯·诺伊曼,哈佛结构独立编址,统一编址:I/O地址空间与内存地址空间编址方式是否统一?例如51为统一编址,I/O和存储器总计64K地址空间;X86为独立编址,分为I/O地址空间和存储器地址空间。IO空间,内存空间X86:支持内存空间,IO空间,独立编址。ARM,MIPS,PowerPC只支持内存空间,即统一编址。IO端口和IO内存:对于X86系统区别很大,例如,网卡接口,可以连接在IO的这

    2022年9月1日
    2
  • 查看linux的内核版本_内核版本

    查看linux的内核版本_内核版本内核版本信息在顶层Makefile文件中lemon@ubuntu:~/Develop/OrangePi_Lite2/lichee/linux-3.10$vimMakefileVERSION=3PATCHLEVEL=10SUBLEVEL=65EXTRAVERSION=NAME=TOSSUGBabyFish

    2022年10月13日
    1
  • svn e175002 解决办法_eclipse安装svn插件使用教程

    svn e175002 解决办法_eclipse安装svn插件使用教程昨天同步svn时报了E175002,如图所示

    2022年10月14日
    1

发表回复

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

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