asp.net mvc cooike 购物车 如何实现
先上代码:
1. ShoppingCartService 类
using System;
using System.Collections.Generic;
using System.Linq;
using LinFx;
using LinFx.Data;
using LinFx.Security;
using LinFx.Web;
using YLSPay.Data.Entity; namespace YLSPay.Data.Service
{
public class ShoppingCartService : IShoppingCartService
{
private readonly IWorkContext _context;
private readonly IRepository<ShoppingCart> _repository; public ShoppingCartService(
IWorkContext context,
IRepository<ShoppingCart> repository)
{
_context = context;
_repository = repository;
} /// <summary>
/// 加入购物车
/// </summary>
/// <param name="user">用户</param>
/// <param name="productVariant">商品</param>
/// <param name="qty">数量</param>
/// <param name="attributes">属性</param>
public void AddToShoppingCart(IUser user, ProductVariant productVariant, int qty, string attributes)
{
if (productVariant == null)
throw new ArgumentNullException("productVariant"); //购物车保存至数据库
ShoppingCart cartItem; var query = _repository.Table.Where(p => p.ProductVariantId == productVariant.Id && p.Attributes == attributes);
if (user == null)
{
var recordId = GetRecordId(null);
cartItem = query.SingleOrDefault(p => p.RecordId == recordId) ?? CreateShoppingCart(recordId);
}
else
{
cartItem = query.SingleOrDefault(p => p.UserId == user.Id) ?? CreateShoppingCart(null, user);
} cartItem.Attributes = attributes;
cartItem.ProductVariantId = productVariant.Id;
cartItem.Quantity += qty;
cartItem.UpdateTime = DateTime.Now; _repository.Save();
} public string GetRecordId(string username)
{
const string name = "recordId"; //if (_context.HttpContext.Response.Cookies[name] == null)
//{
// var cookie = new System.Web.HttpCookie(name)
// {
// Expires = DateTime.Now.AddMinutes(30),
// Value = _context.User != null ? _context.User.UserName : Guid.NewGuid().ToString()
// };
// _context.HttpContext.Response.Cookies.Add(cookie);
// return cookie.Value;
//}
//return _context.HttpContext.Response.Cookies[name].Value; if (_context.HttpContext.Session[name] == null)
{
if(string.IsNullOrEmpty(username))
_context.HttpContext.Session[name] = Guid.NewGuid().ToString();
else
_context.HttpContext.Session[name] = username;
}
return _context.HttpContext.Session[name].ToString();
} }
}
2. IWorkContext
using System.Web;
using LinFx.Security; namespace LinFx.Web
{
public interface IWorkContext
{
IUser User { get; set; }
HttpContextBase HttpContext { get; }
}
}
using System.Web;
using LinFx.Security; namespace LinFx.Web
{
public class WorkContext : IWorkContext
{
public IUser User { get; set; }
//private readonly HttpContextBase _httpContext = new HttpContextWrapper(System.Web.HttpContext.Current); public HttpContextBase HttpContext
{
get { return new HttpContextWrapper(System.Web.HttpContext.Current); }
} //public WorkContext(HttpContextBase contextBase)
//{
// _httpContext = contextBase;
//} //public HttpContextBase HttpContext
//{
// get { return _httpContext; }
//}
}
}
3. Ninject 注入
using LinFx.Caching;
using LinFx.Data;
using LinFx.Index;
using LinFx.Plugin.Search.Services;
using LinFx.Security;
using LinFx.Web;
using YLSPay.Data;
using YLSPay.Data.Service; [assembly: WebActivator.PreApplicationStartMethod(typeof(YLSPay.App_Start.NinjectWebCommon), "Start")]
[assembly: WebActivator.ApplicationShutdownMethodAttribute(typeof(YLSPay.App_Start.NinjectWebCommon), "Stop")] namespace YLSPay.App_Start
{
using System;
using System.Web; using Microsoft.Web.Infrastructure.DynamicModuleHelper; using Ninject;
using Ninject.Web.Common;
using System.Data.Entity; public static class NinjectWebCommon
{
static readonly Bootstrapper bootstrapper = new Bootstrapper(); /// <summary>
/// Starts the application
/// </summary>
public static void Start()
{
DynamicModuleUtility.RegisterModule(typeof(OnePerRequestHttpModule));
DynamicModuleUtility.RegisterModule(typeof(NinjectHttpModule));
bootstrapper.Initialize(CreateKernel);
} /// <summary>
/// Stops the application.
/// </summary>
public static void Stop()
{
bootstrapper.ShutDown();
} /// <summary>
/// Creates the kernel that will manage your application.
/// </summary>
/// <returns>The created kernel.</returns>
private static IKernel CreateKernel()
{
var kernel = new StandardKernel();
kernel.Bind<Func<IKernel>>().ToMethod(ctx => () => new Bootstrapper().Kernel);
kernel.Bind<IHttpModule>().To<HttpApplicationInitializationHttpModule>(); RegisterServices(kernel);
return kernel;
} /// <summary>
/// Load your modules or register your services here!
/// </summary>
/// <param name="kernel">The kernel.</param>
private static void RegisterServices(IKernel kernel)
{
kernel.Bind<HttpContext>().ToMethod(ctx => HttpContext.Current).InRequestScope();
kernel.Bind<HttpContextBase>().ToMethod(ctx => new HttpContextWrapper(HttpContext.Current)).InRequestScope(); kernel.Bind<IWorkContext>().To<WorkContext>().InSingletonScope(); kernel.Bind(typeof(IRepository<>)).To(typeof(Repository<>)).InRequestScope(); }
}
}
问题:
一。如果实现 方步 GetRecordId() 从 cooike 取 ?
二。_context.HttpContext 是会每次都新生成?
每次 new
ShoppingCartService 时就 new 一个 httpcontext ?
各位兄弟,有漏洞吗
cooike 要保存什么东西?
一个guid值? 然后 购物车 数据 保存 数据库存?
asp.net mvc cooike 购物车 如何实现的更多相关文章
- 在ASP.NET MVC实现购物车,尝试一种不同于平常的购物车显示方式
通常,我们看到的购物车是这样的: 虽然这种购物车显示方式被广泛运用,但我个人觉得不够直观.如果换成这样呢? 本篇的源码放在了:https://github.com/darrenji/ShoppingC ...
- 【Pro ASP.NET MVC 3 Framework】.学习笔记.7.SportsStore:购物车
3 创建购物车 每个商品旁边都要显示Add to cart按钮.点击按钮后,会显示客户已经选中的商品的摘要,包括总金额.在购物车里,用户可以点击继续购物按钮返回product目录.也可以点击Check ...
- ASP.NET MVC with Entity Framework and CSS一书翻译系列文章之第一章:创建基本的MVC Web站点
在这一章中,我们将学习如何使用基架快速搭建和运行一个简单的Microsoft ASP.NET MVC Web站点.在我们马上投入学习和编码之前,我们首先了解一些有关ASP.NET MVC和Entity ...
- 自学MVC看这里——全网最全ASP.NET MVC 教程汇总
MVC架构已深得人心,微软也不甘落后,推出了Asp.net MVC.小编特意整理博客园乃至整个网络最具价值的MVC技术原创文章,为想要学习ASP.NET MVC技术的学习者提供一个整合学习入口.本文从 ...
- ASP.NET MVC 5 05 - 视图
PS: 唉,这篇随笔国庆(2015年)放假前几天开始的,放完假回来正好又赶上年底,公司各种破事儿. 这尼玛都写跨年了都,真服了.(=_=#) 好几次不想写了都. 可是又不想浪费这么多,狠不下心删除.没 ...
- ASP.NET MVC学前篇之扩展方法、链式编程
ASP.NET MVC学前篇之扩展方法.链式编程 前言 目的没有别的,就是介绍几点在ASP.NETMVC 用到C#语言特性,还有一些其他琐碎的知识点,强行的划分一个范围的话,只能说都跟MVC有关,有的 ...
- ASP.NET MVC学前篇之Ninject的初步了解
ASP.NET MVC学前篇之Ninject的初步了解 1.介绍 废话几句,Ninject是一种轻量级的.基础.NET的一个开源IoC框架,在对于MVC框架的学习中会用到IoC框架的,因为这种IoC开 ...
- [ASP.NET MVC 小牛之路]02 - C#知识点提要
本人博客已转移至:http://www.exblr.com/liam 本篇博文主要对asp.net mvc开发需要撑握的C#语言知识点进行简单回顾,尤其是C# 3.0才有的一些C#语言特性.对于正在 ...
- [ASP.NET MVC 小牛之路]04 - 依赖注入(DI)和Ninject
本人博客已转移至:http://www.exblr.com/liam 为什么需要依赖注入 在[ASP.NET MVC 小牛之路]系列的理解MVC模式文章中,我们提到MVC的一个重要特征是关注点分离( ...
随机推荐
- DataGrid 使用模型列后实现点击列名称排序
DataGrid 使用模型列后实现点击列名称排序 代码如下: <DataGridTemplateColumn Header="型 号" SortMemberPath=&quo ...
- 安装 SQL Server2008 安装程序规则支持提示“重新启动计算机”失败
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager 删除 PendingFileRenameOperations这个 ...
- 开发中遇到的java小知识
今天在优化一个功能的时候遇到了instr与substr函数,之前没有接触过这两个函数,但是今天无意中用到,一查才发现,真是实用的一对兄弟啊. 先来说说substr函数,这个函数返回的是字符串的一部分. ...
- MyEclipse汉化后问题
今天为了教学生如何汉化MyEclipse10.7,所以讲IDE汉化了一下. 个人还是喜欢用英文版,所以就将D:\MyEclipse\MyEclipse 10目录下的配置文件myeclipse.ini里 ...
- CSS 解决<td>里面内容太多把表格弄变形的原因,设置 自动换行。
1 < style="word-break:break-all"> 例如div宽200px,它的内容就会到200px自动换行,如果该行末端有个英文单词很长(congra ...
- 多线程11-Semaphore信号灯
1.概念 Semaphore可以维护当前访问自身的线程个数,并提供了同步机制.使用Semaphore可以控制同时访问资源的线程个数,例如,实现一个文件允许的并发访问数 2.案例 package org ...
- google protocol buffer -2-.proto 定义规则
essage为主要关键字,类似于java中的class.定义简单message类型 SearchRequest.proto定义了每个查询请求的消息格式,每个请求都会有查询关键词query,查询结果的页 ...
- Mysql 锁粒度
表锁: 表锁是mysql 中最几本的锁策略,并且是开销最小的策略:它会锁定整张表. 一个用户在对表进行锁操作(增,删,改)前,首先要获得写锁,这会阻塞其他用户对该表的所有读写操作.只有没有写锁时,其他 ...
- C#项目代码风格要求(转)
代码风格没有正确与否,重要的是整齐划一,这是我拟的一份<项目代码风格要求>,供大家参考. PDF版下载:项目代码风格要求V1.0.pdf 1. C# 代码风格要求 1.1注释 类型.属性. ...
- UI、ID、UE和GUI,这些都是什么
在网页和应用设计领域中,我们经常会听到人们用这些英文缩写描述设计工作,那么它们各自代表什么含义?具体的工作.方向和区别是什么呢? 下面让我们先来看看它们的英文全称和基本概念. UI(User Inte ...