我从来没有进行过正式的web开发,但是我一直喜欢web,所以这篇文章也是我转行web的一个开始吧。或多或少我也参考了几个网站的实现(当然了,只是看看大概的功能而已),所以也请大家多多指教。该购物车的功能如下:

1. 通过ajax实现添加和删除车上的物品。

2. 删除的物品会显示出来,可以重新添加到购物车。

3. 嗯...没有了,具体大家接着看吧。

购物车的结构我打算用一个table来展示,在UserControl里使用ListView展现购物车的物品(因为比拼接字符串要容易维护的多)。具体代码如下(ShopCartTest.ascx):

1 <asp:ListView ID="ListView1" runat="server">
2 <LayoutTemplate>
3 <table runat="server" cellpadding='0' cellspacing='0' width='100%'>
4 <tr>
5 <td width='7%' style='height: 30px'>
6 商品编号
7 td>
8 <td>
9 商品名称
10 td>
11 <td width='10%'>
12 京东价
13 td>
14 <td width='8%'>
15 返现
16 td>
17 <td width='8%'>
18 赠送积分
19 td>
20 <td width='9%'>
21 商品数量
22 td>
23 <td width='7%'>
24 删除商品
25 td>
26 tr>
27 <tr runat="server" id="itemPlaceholder" />
28 <tr>
29 <td colspan='7' style='height: 30px'>
30 重量总计:<%= this.GetProductsWeight() %>kg   原始金额:¥307.00元 - 返现:¥0.00元<br />
31 <span style='font-size: 14px'><b>商品总金额(不含运费):<span id='cartBottom_price'>¥307.00span>元b>span>
32 td>
33 tr>
34 table>
35 LayoutTemplate>
36 <ItemTemplate>
37 <tr>
38 <td style='padding: 5px 0 5px 0;'>
39 <%#(Container.DataItem as Product).ID %>
40 td>
41 <td>
42 <a target='_blank' href='http://www.xxx.com/product/<%#(Container.DataItem as Product).ID %>.html'>
43 <%#(Container.DataItem as Product).Name %>a>
44 td>
45 <td>
46 <span>
47 <%#(Container.DataItem as Product).Price %>span>
48 td>
49 <td>
50 <%#(Container.DataItem as Product).BackMoney %>
51 td>
52 <td>
53 <%#(Container.DataItem as Product).Score %>
54 td>
55 <td>
56 <a href='#none' title='减一' onclick="changeCount('-','<%#(Container.DataItem as Product).ID %>','sku');"
57 style='text-decoration: none'>-a><input type='text' id='txt<%#(Container.DataItem as Product).ID %>'
58 name='txtChange<%#(Container.DataItem as Product).ID %>' maxlength='4' style='width: 30px'
59 value='<%#(Container.DataItem as Product).Count %>' /><a href='#none' title='加一'
60 onclick="changeCount('+','<%#(Container.DataItem as Product).ID %>');" style='text-decoration: none'>+a>
61 td>
62 <td>
63 <a href='#none' id='btn_del_173259' onclick="removeProductOnShoppingCart('<%#(Container.DataItem as Product).ID %>',this)">
64 删除a>
65 td>
66 tr>
67 ItemTemplate>
68  asp:ListView>

我想大家应不用我解释代码的意思了,很简单。

后台代码如下:

public partial class ShopCartTest : System.Web.UI.UserControl
{
List<Product> productsList = null;

protected override void OnPreRender(EventArgs e)
{
base.OnPreRender(e);

switch (Acion)
{
case "removeProductOnShoppingCart":
productsList = Product.GetProductsInCart(ProductID);
break;
case "changeProductCount":
productsList = Product.GetProductsInCart(null);
foreach (var item in productsList)
{
if (item.ID == ProductID)
{
item.Count = "3";
}
}
break;
case "AddProduct":
productsList = Product.GetProductsInCart(null);
productsList.Add(new Product() { ID = "173233", Name = "ElandMX9470", Price = "399.00", BackMoney = "0.00", Score = "0", Count = "1" });
break;
default:
productsList = Product.GetProductsInCart(ProductID);
break;
}
ListView1.DataSource = productsList;
ListView1.DataBind();
}

public string GetProductsWeight()
{
return Product.GetProductsInCart(ProductID).Sum(p => decimal.Parse(p.Price) * decimal.Parse(p.Count)).ToString();
}

public string GetProductsOriginalPrice()
{
return Product.GetProductsInCart(ProductID).Sum(p => decimal.Parse(p.Price) * decimal.Parse(p.Count)).ToString();
}

public string ProductID { get; set; }

public string Acion { get; set; }
}

把对购物车的逻辑都写到这里面,通过action来判断是什么操作,一样简单的代码。再来看看Product类:

public class Product
{
public string ID { get; set; }
public string Name { get; set; }
public string Price { get; set; }
public string BackMoney { get; set; }
public string Score { get; set; }
public string Count { get; set; }

public static List<Product> GetProductsInCart(string productID)
{
List<Product> list = new List<Product>()
{
new Product{ID="173259",Name="毛毛仔妮妮熊MX9470",Price="99.00",BackMoney="0.00",Score="0",Count="1"},
new Product{ID="155097",Name="xxxxxx新款轻巧便携式电脑桌(送鼠标垫)",Price="79.00",BackMoney="¥0.00",Score="0",Count="1"},
new Product{ID="155098",Name="xxxxxx护眼台灯(理想)STL-T412W-03WT",Price="69.00",BackMoney="¥0.00",Score="0",Count="1"}
};

return list.Where(p => { return p.ID != productID; }).ToList();
}
}

接下来在ShopCartDetail.aspx页面使用该UserControl:

<div id="products">
<demo:ShopCartTest ID="ShopCartTest1" runat="server" />
div>

通过ajax使用购物车还需要两个类:

public class GetProducts : IHttpHandler
{

public void ProcessRequest(HttpContext context)
{
context.Response.ContentType = "text/plain";

ViewManager<ShopCartTest> viewManager = new ViewManager<ShopCartTest>();

ShopCartTest control = viewManager.LoadViewControl("~/ShopCartTest.ascx");

control.ProductID = context.Request.QueryString["productId"];
control.Acion = context.Request.QueryString["action"];

context.Response.Write(viewManager.RenderView(control));
}

public bool IsReusable
{
get
{
return false;
}
}
}

public class ViewManager<T> where T : UserControl
{
private Page m_pageHolder;

public T LoadViewControl(string path)
{
m_pageHolder = new Page();
return this.m_pageHolder.LoadControl(path) as T;
}

public string RenderView(T control)
{
StringWriter output = new StringWriter();

this.m_pageHolder.Controls.Add(control);

HttpContext.Current.Server.Execute(this.m_pageHolder, output, false);

return output.ToString();
}
}

这两个类是参考老赵提出来的方案完成,具体原理,你可以看这里。

剩下来都是javascript了,这里我并没有使用任何类库或者框架。代码如下:

1 function ajaxCommon(requst) {
2 var xmlHttp = false;
3 if (window.ActiveXObject) {
4 xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
5 }
6 else {
7 if (window.XMLHttpRequest) {
8 xmlHttp = new XMLHttpRequest();
9 }
10 }
11 xmlHttp.onreadystatechange = function() { getAjaxValue(xmlHttp) }
12 xmlHttp.open("GET", "/GetProducts.ashx" + '?roid=' + Math.random() + '&' + requst);
13 xmlHttp.send(null);
14 }
15
16  function getAjaxValue(xmlHttp) {
17
18 if (xmlHttp.readyState == 4) {
19 if (xmlHttp.status == 200) {
20 document.getElementById("products").innerHTML = xmlHttp.responseText;
21 }
22 }
23 }
24
25  function addProduct(productID, productCount) {
26 ajaxCommon("action=AddProduct&productId=" + productID + "&productCount=" + productCount);
27 }
28
29  function removeProductOnShoppingCart(productId, obj) {
30 debugger;
31 setDelProduct(obj, productId);
32
33 ajaxCommon("action=removeProductOnShoppingCart&productId=" + productId);
34
35 setDelProductShow();
36 }
37
38  function changeCount(type, productID) {
39 var changeCount = 0;
40 var txtCount = 0;
41 if (type == "-") {
42 changeCount = -1;
43 }
44 if (type == "+") {
45 changeCount = 1;
46 }
47 txtCount = document.getElementById("txt" + productID).value;
48
49 ajaxCommon("action=changeProductCount&productId=" + productID + "&productCount=" + txtCount);
50 }
51
52  function DeledProductInfo() {
53 this.ID = '';
54 this.Name = '';
55 this.Price = '';
56 this.Count = '';
57 }
58
59  var delProduct = null;
60  function setDelProduct(obj, productID) {
61 try {
62 delProduct = new DeledProductInfo();
63 var trObj = obj.parentNode.parentNode;
64
65 delProduct.ID = trObj.cells[0].innerHTML;
66 delProduct.Name = trObj.cells[1].innerHTML;
67 delProduct.Price = trObj.cells[2].innerHTML;
68 delProduct.Count = document.getElementById('txt' + productID).value;
69 } catch (e) { }
70
71 }
72
73  function setDelProductShow() {
74 try {
75 if (document.getElementById('divDeledProduct') == null) return;
76 if (delProduct != null && delProduct.ID != '') {
77 var dHtml = " <table><tr>";
84 dHtml += "<td style='width:70px'>" + delProduct.ID + "</td>";
79 dHtml += "<td style='text-align:left'>" + delProduct.Name + "</td>";
80 dHtml += "<td>" + delProduct.Price + "</td>";
81 dHtml += "<td>" + delProduct.Count + "</td>";
82 dHtml += "<td><a href='#none' οnclick=\"addProduct('" + delProduct.ID + "','" + delProduct.Count + "');reAddedProduct('delProduct" + delProduct.ID + "');\">重新购买</a></td>";
83 dHtml += "</tr></table>";
  
85 document.getElementById('divDeledProduct').style.display = '';
86
87 document.getElementById('divDeledProduct').innerHTML += "

" + dHtml + " 

";
88
89 }
90
91 delProduct = null;
92 } catch (e) { }
93 }
94
95  function reAddedProduct(reAddDivId) {
96 try {
97 debugger;
98 document.getElementById('divDeledProduct').removeChild(document.getElementById(reAddDivId));
99 if (document.getElementById('divDeledProduct').childNodes.length == 0) {
100 document.getElementById('divDeledProduct').style.display = 'none';
101 }
102 } catch (e) { }
103 }

代码依旧很容易看懂,需要解释的就是删除的操作,分为三步:

  • 将需要删除的物品先保存起来:setDelProduct(obj, productId);
  • 在后台购物车清单上面将物品删除,并返回删除后的物品清单:ajaxCommon("action=removeProductOnShoppingCart&productId=" + productId);
  • 将删除的物品输出,放到已删除列表(完全在客户端操作):setDelProductShow();

还有从删除列表中将删除的物品重新添加到购物车当中,分为两步:

  • 在后台将物品添加到物品清单(和直接添加物品调用同一个方法):addProduct
  • 从已删除列表中将该物品删除(完全在客户端操作):reAddedProduct

这样,一个基本的购物车就完成了。但是具体对于数据的操作,需要您进一步处理。本文对于数据的操作只是示例而已。

一起谈.NET技术,浅析购物车的实现相关推荐

  1. 基础网络爬虫(Web crawler)相关技术浅析

    文章目录 前言 基本概念 Robots协议 基本原理 现状概况 爬虫软件 跨语言 Selenium Python urllib requests Scrapy Pyspider Java WebMag ...

  2. 浅谈虚拟化技术下的云安全如何处置

    浅谈虚拟化技术下的云安全如何处置 近年来,云计算是目前非常热门的一个研究领域,其实它并不是一种全新的技术,而是许多技术的融合体,包括分布式计算.动态和拓展等各种各样的技术算法,而虚拟化技术是云计算里最 ...

  3. 技术创业需胆识 谈IT技术人员的创业 (http://www.cnblogs.com/dudu/archive/2007/05/27/761740.html)...

    技术创业需胆识 谈IT技术人员的创业 作者:李立辉 我自己介绍一下:本人96年西点毕业,学的是无线通信,柳传志是我的校友,后来分配到北京巨龙做交换机,98年去了深圳中兴,当时看到中兴日益强大,和华为的 ...

  4. (转)完美画质 3D游戏反锯齿技术浅析 .

    完美的画面已经离我们不再遥远--反锯齿技术浅析 不管现今的游戏画面有多完美,人物和环境有多真实,但游戏画面的构成的主要方式仍然没有得到改善:一帧画面由成千上万像素构成.这意味着物体多边形的轮廓最终是锯 ...

  5. 浅谈.NET技术公司的实习生培养

    浅谈.NET技术公司的实习生培养 背景 近几年.NET开发者市场的越发不景气,一毕业就选择.NET技术的开发者更是少之又少.一方面是公司效益的日益提高,一方面却是招聘优秀人才的速度总是赶不上公司发展的 ...

  6. 以计算机谈人文科学,阅读下面一段文字,完成问题   自20世纪80年代以来,世界都在谈“软科学技术”,何谓软科学?经常听人说:“脑子不够使。”这其实就是对软科学的需求。于是,从古至今,...

    阅读下面一段文字,完成问题 自20世纪80年代以来,世界都在谈"软科学技术",何谓软科学?经常听人说:"脑子不够使."这其实就是对软科学的需求.于是,从古至今, ...

  7. 界面上下固定_【技术浅析】三通道机床自动上下料控制方法应用

    摘要:当前制造业竞争日益激烈,产品性价比与产能限制为许多中小企业提供了生存空间,也是大型企业抢夺市场份额的终极利器.现介绍一种三通道机床自动上下料控制方法,即一个数控系统控制两个加工通道异步加工,并且 ...

  8. 浅谈Hybrid技术的设计与实现【转】

    https://www.cnblogs.com/yexiaochai/p/4921635.html 前言 浅谈Hybrid技术的设计与实现 浅谈Hybrid技术的设计与实现第二弹 浅谈Hybrid技术 ...

  9. 浅谈Hybrid技术的设计与实现第二弹

    前言 浅谈Hybrid技术的设计与实现 浅谈Hybrid技术的设计与实现第二弹 浅谈Hybrid技术的设计与实现第三弹--落地篇 接上文:浅谈Hybrid技术的设计与实现(阅读本文前,建议阅读这个先) ...

  10. 从研发角度谈存储技术的学习

    从研发角度谈存储技术的学习 收藏 对于研发人员,存储技术的学习内容非常之多.我根据自己的理解,把它们大致分为以下8项内容: http://blog.csdn.net/liuben/archive/20 ...

最新文章

  1. 图解 windbg设置符号文件路径和使用入门
  2. Garbage Collection Optimization for High-Throughput and Low-Latency Java Applications--转载
  3. OpenCV基于LeNet-5和连接组件分析的数字识别的实例(附完整代码)
  4. 百度地图api 去左下角百度地图logo的方法
  5. 【Jetson-Nano】2.Tensorflow和Pytorch的安装
  6. 信息学奥赛一本通(1208:2的幂次方表示)
  7. MySQL高级知识(九)——慢查询日志
  8. vulkan 利用GPU加速ENet
  9. 在 ArcView 3.3 中裁剪 DEM 数据
  10. 8、Python车牌数据集自动生成及其图片叠加
  11. 理光Ricoh Aficio MP 6002 一体机驱动
  12. 莫 言------------- 我们的荆轲
  13. Amigo 源码解读
  14. 2018天池大数据-印象盐城:数创未来大数据竞赛经验分享
  15. 代理IP如何解决爬虫IP被封
  16. CSS实现幻灯片效果
  17. oracle中三元运算符,三目运算符简介 - ZICK_ZEON的个人空间 - OSCHINA - 中文开源技术交流社区...
  18. PPT图片瘦身/图片提取
  19. 如何检索国家自然科学基金项目信息并下载结题报告
  20. Flutter实践之高仿有妖气漫画,移动客户端开发工程师专业

热门文章

  1. Win64 驱动内核编程-11.回调监控进线程句柄操作
  2. Python 第二章-列表和元组
  3. 【数字信号处理】序列傅里叶变换 ( 基本序列的傅里叶变换 | 求 a^nu(n) 的傅里叶变换 )
  4. 【Android 逆向】Android 系统文件分析 ( /proc/ 目录文件分析 | 记录系统和进程信息 | version 内核版本信息文件 )
  5. 【Android 安装包优化】Android 中使用 SVG 图片 ( SVG 矢量图简介 | Android 中生成 Vector 矢量图资源 )
  6. 【Android 热修复】热修复原理 ( 多 Dex 打包机制 | 多 Dex 支持 | Dex 分包设置 | 开发和产品风格设置 | 源码资源 )
  7. 【计算理论】图灵机 ( 接受状态作用 | 格局 | 图灵机语言 | 图灵机设计复杂性 )
  8. 【bzoj3105】新Nim游戏
  9. kbmmw 的HTTPSmartService入门
  10. Jzoj3931【NOIP2014day1官方数据】联合权值