注本文引用自:http://www.cnblogs.com/xlb2000/archive/2010/08/25/1796405.html谢谢这个大牛,这篇文章我保存起来自己用了!谢谢。

前面一篇文章讲到了如何快速的配置起Profile和如何在应用程序中使用Profile存储用户自定义信息。 但是在前面,Profile中存储的是简单数据类型,比如int、String等。现在,我们讲解如何存储自定义数据类型,比如:购物车类。在这里就把Petshop中的这一块单独抠出来,稍许简化一点,做一个讲解。

  首先打开上一章的网站(或者新建一个网站,按照前几篇文章讲解的内容配置好Membership、profile、连接字符串等),然后在统一解决方案下再添加一个类库项目,起名为Models。在里边添加一个类CartItemInfo。内容如下:

public class CartItemInfo
    {
        public string Name { get; set; }
        public string Type { get; set; }
        public decimal Price { get; set; }
        public int Quantity { get; set; }
    }

  代表购物车中存储的一项商品。

  第三步:再次添加一个类库项目,起名为BLL。然后添加Models层的引用。然后在其中添加一个类Cart代表购物车:

    public class Cart     {         private Dictionary<string, CartItemInfo> cartItems = new Dictionary<string, CartItemInfo>();
        /// <summary>         /// 总价         /// </summary>        public decimal Total         {             get             {                 decimal total = 0;                 foreach (CartItemInfo item in cartItems.Values)                 {                     total += item.Price * item.Quantity;                 }                 return total;             }         }         /// <summary>         /// 设置某一项产品的数量         /// </summary>         /// <param name="Name"></param>         /// <param name="qty"></param>        public void SetQuantity(string Name, int qty)         {             cartItems[Name].Quantity = qty;         }         /// <summary>         /// 购物车中,产品个数         /// </summary>        public int Count         {             get             {                 return cartItems.Count;             }         }
        public void Add(string name, string type, decimal price, int quantity)         {             CartItemInfo item;             //判断该产品是否在集合当中,如果有,则直接数量+1             //如果没有,则创建一个新的购物车项加入到集合当中            if (!cartItems.TryGetValue(name, out item))             {                 item = new CartItemInfo { Name = name, Type = type, Price = price, Quantity = quantity };                 cartItems.Add(item.Name, item);             }             else             {                 cartItems[name].Quantity++;             }         }         public void Add(CartItemInfo item)         {             Add(item.Name, item.Type, item.Price, item.Quantity);         }         /// <summary>         /// 从购物车中移除一项         /// </summary>         /// <param name="name"></param>        public void Remove(string name)         {             cartItems.Remove(name);         }         /// <summary>         /// 清空购物车         /// </summary>        public void Clear()         {             cartItems.Clear();         }         /// <summary>         /// 得到购物车列表         /// </summary>        public ICollection<CartItemInfo> CartItems         {             get             {                 return cartItems.Values;             }         }     }

public class Cart
    {
        private Dictionary<string, CartItemInfo> cartItems = new Dictionary<string, CartItemInfo>();

/// <summary>
        /// 总价
        /// </summary>
        public decimal Total
        {
            get
            {
                decimal total = 0;
                foreach (CartItemInfo item in cartItems.Values)
                {
                    total += item.Price * item.Quantity;
                }
                return total;
            }
        }
        /// <summary>
        /// 设置某一项产品的数量
        /// </summary>
        /// <param name="Name"></param>
        /// <param name="qty"></param>
        public void SetQuantity(string Name, int qty)
        {
            cartItems[Name].Quantity = qty;
        }
        /// <summary>
        /// 购物车中,产品个数
        /// </summary>
        public int Count
        {
            get
            {
                return cartItems.Count;
            }
        }

public void Add(string name, string type, decimal price, int quantity)
        {
            CartItemInfo item;
            //判断该产品是否在集合当中,如果有,则直接数量+1
            //如果没有,则创建一个新的购物车项加入到集合当中
            if (!cartItems.TryGetValue(name, out item))
            {
                item = new CartItemInfo { Name = name, Type = type, Price = price, Quantity = quantity };
                cartItems.Add(item.Name, item);
            }
            else
            {
                cartItems[name].Quantity++;
            }
        }
        public void Add(CartItemInfo item)
        {
            Add(item.Name, item.Type, item.Price, item.Quantity);
        }
        /// <summary>
        /// 从购物车中移除一项
        /// </summary>
        /// <param name="name"></param>
        public void Remove(string name)
        {
            cartItems.Remove(name);
        }
        /// <summary>
        /// 清空购物车
        /// </summary>
        public void Clear()
        {
            cartItems.Clear();
        }
        /// <summary>
        /// 得到购物车列表
        /// </summary>
        public ICollection<CartItemInfo> CartItems
        {
            get
            {
                return cartItems.Values;
            }
        }
    }

  第四步:在网站项目中添加BLL层和Models层的引用。

  ok到此所有准备工作告一段落,开始配置Profile。打开网站的web.config文件,修改Profile节点的Properties节点为下面内容:

<properties>
    <add name="Cart" type="BLL.Cart" allowAnonymous="true"/>
</properties>

  注意:type必须前面带上命名空间的名字。

  配置完毕!

  现在新建一个页面,页面很简单:

<form id="form1" runat="server">
    <div>
    名称:<asp:TextBox runat="server" ID="txtName"></asp:TextBox><br />
    类型:<asp:TextBox runat="server" ID="txtType"></asp:TextBox><br />
    价格:<asp:TextBox runat="server" ID="txtPrice"></asp:TextBox><br />
    数量:<asp:TextBox runat="server" ID="txtQuantity"></asp:TextBox><br />
    <asp:Button runat="server" Text="添加到购物车" ID="btnAddCart" OnClick="btnAddCart_Click" />
    </div>
</form>

后台代码为:

public void btnAddCart_Click(object sender, EventArgs e)
    {
        CartItemInfo item = new CartItemInfo
        {
            Name = txtName.Text,
            Type = txtType.Text,
            Price = decimal.Parse(txtPrice.Text),
            Quantity = int.Parse(txtQuantity.Text)
        };

Profile.Cart.Add(item);
    }

 首先在Profile.Cart.Add(item);这里加一个断点,然后以调试方式运行页面。在四个文本框中分别输入内容,并单击添加到购物车,第一次命中断点时,可以从监视窗口中看到Profile.Cart.CartItems.Count=1,说明刚才创建的对象添加到了集合当中。可是当我们再次点击添加到购物车按钮时,情况发生了变化在运行Profile.Cart.Add(item);这句代码之前Profile.Cart.CartItems.Count属性=0!刚才添加的哪个商品哪去了?为什么之前的简单数据类型数据可以保留,而现在变为购物车类之后却又不可以了呢?

  要解决这个问题有两种做法:

  第一种,修改Properties节点如下所示:

<properties>
    <add name="Cart" type="BLL.Cart" allowAnonymous="true" serializeAs="Binary"/>
</properties>

 给Cart增加了一个属性serializeAs="Binary",然后给Models层的CartItemInfo类和BLL层的Cart类,增加一个[Serializable]特性:

    [Serializable]
    public class Cart{....}

[Serializable]
    public class CartItemInfo{.....}

  然后再次重复刚才的步骤,你会发现:数据可以正确保存了。

  第二种方法:需要修改一下代码了:将Cart类的Dictionary<string,CartItemInfo>替换为List<CartItemInfo>,并且将所有需要保存的成员设置为Public访问权限,即可。

  为什么要做这两种修改之后,才可以正确保存用户的数据呢?这是因为,Profile在保存用户自定义类型时,需要将产生的对象“序列化”后,保存到数据库当中。在需要读取数据时,将保存的数据“反序列化”后,还原成对象。前面的两种改变,其实就是序列化的两种方式:二进制序列化和XML序列化。当然,在存储简单数据类型时,Profile会将这些内容序列化为字符串。

  所谓序列化,就是将一个内存中的对象,转变成一个磁盘文件的过程。顾名思义,二进制序列化就是转变成一个二进制文件,XML序列化转变成一个XML文件。举个例子,我们玩的游戏。最著名的就是大菠萝《暗黑破坏神2》了,我们经常会去网上下载一些非常牛X的存档,然后放到游戏目录下,就可以去游戏中体验这些非常牛的角色和装备。那么这些存档,其实就是序列化之后的文件。游戏将这些磁盘上的文件反序列化后变成内存当中的对象,也就是人物了。XML序列化的好处在于你可以将对象中的数据传送给其他应用程序。

  总结一下:当我们需要在Profile中存放自定义数据类型时,需要指明自定义对象的序列化方式(默认为XML序列化方式)。

   XML序列化需要将自定义类型的数据成员设为公有,私有成员和方法不会被保存。同时XML序列化方式支持实现了ICollection接口的集合(前面将Dictionary换成List,是因为Dictionary没有实现ICollection接口,它实现的是IDictionary接口)。下图是XML序列化后,数据库中保存的数据:

二进制序列化同样非常简单,对于要序列化的对象没有任何要求,只要在需要序列化的类上面增加[Serilizable]特性即可。需要注意的是,类中的所有成员都必须有此特性。这种特性不能继承,也就是说父类加了,子类还得加。

好了,关于Profile就先说到这里,后面还有两个点:匿名用户向登录用户的数据迁移,和自定义数据存储

  源代码

转载于:https://www.cnblogs.com/liuyu7177/archive/2013/05/07/3065070.html

ASP.NET用户个性化设置Profile——配置2相关推荐

  1. ASP.NET用户个性化设置Profile——配置2 (转)

    前面一篇文章讲到了如何快速的配置起Profile和如何在应用程序中使用Profile存储用户自定义信息. 但是在前面,Profile中存储的是简单数据类型,比如int.String等.现在,我们讲解如 ...

  2. ASP.NET用户个性化设置Profile——配置

    前面一篇文章讲到了如何快速的配置起Profile和如何在应用程序中使用Profile存储用户自定义信息. 但是在前面,Profile中存储的是简单数据类型,比如int.String等.现在,我们讲解如 ...

  3. ASP.NET用户个性化设置Profile

    前面一篇文章讲到了如何快速的配置起Profile和如何在应用程序中使用Profile存储用户自定义信息. 但是在前面,Profile中存储的是简单数据类型,比如int.String等.现在,我们讲解如 ...

  4. bs 程序用户个性化设置保存_想更改win10设置,这12种打开方法你不可不知,方便又快捷...

    "设置"应用程序是Windows 10中最有用和最重要的应用程序之一,我们设置帐户.应用程序.系统.设备.网络和Internet.个性化.时间和语言.更新和安全等等都要通过它来进行 ...

  5. 服务器文件共享不同用户互访设置,samba配置_samba文件共享服务配置详解

    摘要 腾兴网为您分享:samba文件共享服务配置详解,之了课堂,央视影音,人人理财,平安证券等软件知识,以及游戏通用窗口化工具,福建省校讯通,净天之命1.71,teamviewer安卓,宝贝听听,手机 ...

  6. linux普通用户的环境变量配置

    问题 使用非root用户,在启动es(压缩版)的过程中,报: warning: Falling back to java on path. This behavior is deprecated. S ...

  7. 在ASP.NET AJAX中使用应用程序服务和本地化(3):用户个性化组件ProfileService

    本文来自<ASP.NET AJAX程序设计 第II卷:客户端Microsoft AJAX Library相关>的第五章<应用程序服务和本地化>. 在内建了身份认证应用程序服务之 ...

  8. 在ASP.NET AJAX中使用应用程序服务和本地化(4):示例程序:读取、修改并保存用户个性化信息...

    本文来自<ASP.NET AJAX程序设计 第II卷:客户端Microsoft AJAX Library相关>的第五章<应用程序服务和本地化>. 让我们通过编写一个完整的示例程 ...

  9. 个性化设置Linux用户登录信息

    Linux系统操作学习手记 个性化设置Linux用户登录信息 目标清单 资源文件 工具 实现过程 效果图 个性化设置Linux用户登录信息 使用Linux用户时,用户往往希望在登录时获取想要的信息,同 ...

最新文章

  1. boost::statechart模块实现无效结果复制测试
  2. html行级元素和块级元素以及css转换
  3. java访问本地文件_java 读取本地文件 更改
  4. Qt的工程文件讲解 .pro
  5. 周末ROS学习沙龙第一期——ROS历史、安装、消息话题节点服务等概念、SLAM导航框架及参数、小车上运行SLAM
  6. 15.深入理解Zend执行引擎(PHP5)
  7. python通过类名创建对象_如何在Python中为自动创建的类对象分配名称
  8. 正交试验软件测试用例设计方法【建议收藏】
  9. python中round的用法_python中round函数如何使用
  10. Python修改图片大小
  11. 找出01二维矩阵中只包含 1 的最大正方形,并输出其面积_java
  12. 儿童手表电话卡遇到问题需要怎么解决
  13. 运行 CTS 测试命令
  14. 说起仙人掌,相信你一定不会觉得陌生
  15. 关于个人微信公众号开通运营通知
  16. 杭银消费金融拟增资扩股:杭州银行认购3.7亿股,曾被罚50万元
  17. android 遍历 for(Object i:list)
  18. C语言 指向函数的指针
  19. 密码学概述与基本加密方式
  20. 求数学系或计算机系姓张的学生的信息,西安财经学院信息学院实验报告实验四郑莹莹1005230303.pdf...

热门文章

  1. Adobe Audition 3.0消除人声技巧二则
  2. 使用java代码发送gmail邮件
  3. iT人家喜迎2010中秋佳节“祝福有礼”活动!
  4. 高级口译 WordList2
  5. Java高质量面试总结(好文章!!)
  6. 【周末闲谈】AI作图,你真的了解它吗?
  7. 如何保护源代码(来自csdn讨论区)
  8. CAMWrok切换成中文语言
  9. 互联网公司寄件管理教程
  10. PyTorch深度学习60分钟闪电战:04 训练一个分类器