asp.net mvc cooike 购物车 如何实现

   2023-02-09 学习力0
核心提示:先上代码: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 Shoppin

先上代码:

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值? 然后 购物车 数据 保存 数据库存? 
 
反对 0举报 0 评论 0
 

免责声明:本文仅代表作者个人观点,与乐学笔记(本网)无关。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
    本网站有部分内容均转载自其它媒体,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责,若因作品内容、知识产权、版权和其他问题,请及时提供相关证明等材料并与我们留言联系,本网站将在规定时间内给予删除等相关处理.

  • 使用WebClient自动填写并提交ASP.NET页面表单的源代码
    使用WebClient自动填写并提交ASP.NET页面表单的
    转自:http://www.cnblogs.com/anjou/archive/2007/03/07/667253.html 在.NET中通过程序填写和提交表单还是比较简单。比如,要提交一个如下图所示的登录表单:           填写和提交以上表单的代码如下:       // 要提交表单的URI字符串
    02-09
  • asp.net mvc多条件+分页查询解决方案
    


            
asp.net mvc多条件+分页查询解决方案
    asp.net mvc多条件+分页查询解决方案
    http://www.cnblogs.com/nickppa/p/3232535.html开发环境vs2010css:bootstrapjs:jquery    bootstrap paginator原先只是想做个mvc的分页,但是一般的数据展现都需要检索条件,而且是多个条件,所以就变成了MVC多条件+分页查询因为美工不是很好,所以用的是
    02-09
  • ASP.NET操作Cookies的问题(Bug or Not)
    以下存和取都是在不同的页面中,如果是在同一个页面也没必要用cookies了。 Test1: 给Cookies赋值: const string AAA="aaa"; Response.Cookies[AAA].Value = "111;222;333"; 取值: string value = Request.Cookies[AAA].Value; // value为111 Test2: 给Cooki
    02-09
  • Asp.Net Core 自定义验证属性
      很多时候,在模型上的验证需要自己定义一些特定于我们需求的验证属性。所以这一篇我们就来介绍一下怎么自定义验证属性。  我们来实现一个验证邮箱域名的自定义验证属性,当然,最重要的是需要定义一个继承自ValidationAttribute的类,然后在实现其IsVal
    02-09
  • Asp.Net 之 枚举类型的下拉列表绑定
    有这样一个学科枚举类型:/// 学科 /// /summary public enum Subject {None = 0,[Description("语文")]Chinese = 1,[Description("数学")]Mathematics = 2,[Description("英语")]English = 3,[Description("政治")]Politics = 4,[Description("物理&qu
    02-09
  • [ASP.NET笔记] 1.Web基础知识
         1:http协议:     2:web服务器:     3:静态网页的概念     4:动态网页的概念       http协议:http(hypertext transfer protocol) 即超文本传输协议,这个协议是在internet上进行信息传送的协议任何网页之间要相互沟通,必须要尊循
    02-09
  • ASP.NET邮件发送 .net 发送邮件
      今天做了个ASP.NET做发送邮件功能,发现QQ邮箱好奇怪,当你用QQ邮箱做服务器的时候什么邮件都发送不出去(QQ邮箱除外)。而且爆出这样的错误:"邮箱不可用。 服务器响应为: Error: content rejected.http://mail.qq.com/zh_CN/help/content/rejectedmail.ht
    02-09
  • 由ASP.NET Core根据路径下载文件异常引发的探究
    前言    最近在开发新的项目,使用的是ASP.NET Core6.0版本的框架。由于项目中存在文件下载功能,没有使用类似MinIO或OSS之类的分布式文件系统,而是下载本地文件,也就是根据本地文件路径进行下载。这其中遇到了一个问题,是关于如何提供文件路径的,通
    02-09
  • ASP.NET的运行原理与运行机制 ASP.NET的开发模式包括
    ASP.NET的运行原理与运行机制 ASP.NET的开发模
    在Asp.net4和4.5中,新增了WebPages Framework,编写页面代码使用了新的Razor语法,代码更加的简洁和符合Web标准,编写方式更接近于PHP和以前的Asp,和使用WebForms这种模仿Windows Form编程方式有了很大不同,不再有大量控件和控件生成的大量不够灵活的代码
    02-09
  • ASP.NET 后台接收前台POST过来的json数据方法
     ASP.NET前后台交互之JSON数据 https://www.cnblogs.com/ensleep/p/3319756.html
    02-09
点击排行