既然由登录控件涉及到了Membership,那么就不得不提到用户个性化Profile对象。个性化允许为用户保存特定的个性化信息到数据库中,因此它不同于ASP.NET状态管理之处在于可以永久性保存这些信息,很有必要强调一下web application与website的一个不同,web application中无法象website中那样,直接用Profile对象(http://hi.baidu.com/windlhj/blog/item/8f4c4a13779de02fdc5401b7.html,web application和website相互转化http://blog.csdn.net/guwenzhong/archive/2009/11/10/4792814.aspx)。个性化的设置与Membership的设置非常类似:

1.配置个性化提供者

默认个性化提供者是SqlProfileProvider,它使用ASP.NET.MDF(怎么样是不是非常熟悉,忘记的话去看Membership的设置)存储个性化信息。实际上你按照Membership的设置创建好数据存储,也就把个性化的数据存储创建好了,因为Membership与Profile用的是一个数据库(包括利用aspnet_regsql.exe更换数据库以后),用户的个性信息保存在数据库的aspnet_profile表中。与Membership一样Profile的个性提供者也是在根web.config里配置的。因为之前已经配置好了数据库连接节点,所以这里只配个性化提供者就行了:

<system.web>

<profile defaultProvider="MyFirstSqlProfileProvider">

<providers>

<clear/>

<add name="MyFirstSqlProfileProvider" type="System.Web.Profile.SqlProfileProvider"

connectionStringName="newsystemConnectionString" applicationName="ProfileDemo"/>

</providers>

</profile>

</system.web>

这样就配置好了个性化提供者,其名字是MyFirstSqlProfileProvider。

而我们既然要存储用户的个性化信息到aspnet_profile表中,我们必须为其添加属性,而这些属性要在<profile>节点内的<properties>里用<add>标签添加,并且至少要有一个属性名:

<system.web>

<profile defaultProvider="MyFirstSqlProfileProvider">

<providers>

<clear/>

<add name="MyFirstSqlProfileProvider" type="System.Web.Profile.SqlProfileProvider"

connectionStringName="newsystemConnectionString" applicationName="ProfileDemo"/>

</providers>

<properties>

<add name="QQ" type="string"/>

<add name="Age" type="Int32"/>

<add name="Address" type="string"/>

<add name="Tel" type="string"/>

</properties>

</profile>

</system.web>

profile属性的意思:name(属性名,必须)type(属性类型,默认是string)serializeAs(当序列化时使用的格式)

readOnly(只读属性)defaultValue(属性的默认值)allowAnonymous(布尔值,是否允许匿名用户读取和设置该属性)

Provider(该属性关联的个性化提供者)customProviderData(允许用户传递自定义数据到个性化提供者)

使用个性化属性

在默认情况下只有验证用户才能读取和写入个性化信息到数据库,举例如下:

//直接给profile赋值就可保存用户个性化,很类似session

protected void Button1_Click(object sender, EventArgs e)

{

//在webapp中无法像website中那样直接使用profile对象,引入using System.Web.Profile还是无法直接用,但可以使用ProfileBase,ProfileManager,ProfileMigrateEventArgs等类。

//存储个性化信息

HttpContext.Current.Profile.SetPropertyValue("QQ", TextBox9.Text);

HttpContext.Current.Profile.SetPropertyValue("Age", int.Parse(DropDownList2.SelectedValue));

HttpContext.Current.Profile.SetPropertyValue("Tel", TextBox10.Text);

HttpContext.Current.Profile.SetPropertyValue("Address",TextBox11.Text);

}

protected void Button2_Click(object sender, EventArgs e)

{

//获取个性化信息

Label1.Text = "当前用户:" + HttpContext.Current.Profile.UserName + "QQ:" +                                            HttpContext.Current.Profile.GetPropertyValue("QQ") + "Age:" +                                             HttpContext.Current.Profile.GetPropertyValue("Age") + "Tel" +                                           HttpContext.Current.Profile.GetPropertyValue("Tel") + "Address" +                                       HttpContext.Current.Profile.GetPropertyValue("Address");

}

还可以给个性化属性分组便于管理:在web.config中<properties>节点内加<group>再添加组名跟属性即可:

<system.web>

<profile defaultProvider="MyFirstSqlProfileProvider">

<providers>

<clear/>

<add name="MyFirstSqlProfileProvider" type="System.Web.Profile.SqlProfileProvider"

connectionStringName="newsystemConnectionString" applicationName="ProfileDemo"/>

</providers>

<properties>

<add name="QQ" type="string"/>

<add name="Age" type="Int32"/>

<add name="Address" type="string"/>

<add name="Tel" type="string"/>

<group name="Habits">

<add name="likebooks"/>

<add name="likesports"/>

</group>

</properties>

</profile>

</system.web>

那些属性的type类型也可以是自己写的类(该类既可以在App_Code里(App_Code相当于当前命名空间里的子命名空间(在webapp里使用注意其里面类的属性要改成编译才能被智能提示))也可以在已编译好的DLL里(DLL是程序集的一种形式(另一种是exe)但在Web.config里一定要写全类所在的命名空间.类名,否则会出现找不到类型的错误):

如 <add name="ZiDingDe" type="Dingyibymyself.personlity"/> 属性名ZiDingDe 类型              写全类所在的命名空间.类名  Dingyibymyself.personlity

再如在App_Code里的自定义类   <add name="ZiDingDe2" type="WebApplication1.App_Code.personlity"/> 是不是就是子命名空间?

http://www.cnblogs.com/xlb2000/archive/2010/08/25/1796405.html(注意作者在最后对序列化及Profile对自定义类的序列化处理的解释)
在aspnet_proile表里PropertyNames里是属性名(包括自定义的属性名)PropertyValuesString里是简单类型属性的值PropertyValuesBinary里是自定义类型属性的值(此时类的对象已被xml序列化或二进制序列化)。
由于获取自定义类型属性值时获得的是一个类的对象(已经反xml或二进制序列化回来),所以要取得自定义类里的属性值要先创建一个引用指向它,然后再用引用取得自定义类里的属性值:
  protected void Button1_Click(object sender, EventArgs e)
        {
            person pp = (person)HttpContext.Current.Profile.GetPropertyValue("ZiDingDe");
            Label1.Text = "当前用户:" + HttpContext.Current.Profile.UserName +                                   "QQ"+pp.QQ+"Age"+pp.Age+"Tel"+pp.Tel+"Address"+pp.Address;
        }
匿名用户个性化
默认情况下,匿名用户不能保存个性化信息,但有些时候(比如购物网匿名用户也可以向购物车添加商品)就需要为匿名用户创建一些临时的个性化信息。ASP.NET的匿名识别特性可以为匿名用户产生一个随机的标识符,用来唯一识别该匿名用户,然后将匿名用户的个性化信息保存到数据库。但匿名个性化会在数据库中保存很多无用的信息。开启匿名个性化方法:在根web.config的<system.web>节点下的添加<anonymousIdentification enable="true"/>元素。然后在<properties>中指定哪些属性可以被匿名用户用来保存信息(如<add name="Book"allowAnonymous="true"/>)。然后但匿名用户保存这些个性化属性信息时就像用户保存那样处理就可以了。
试想如果仅仅是这样那不就没什么实际作用还白白增加了一些无用信息?(还是举购物网的例子,如果匿名用户在匿名时向购物车添加了一些商品,之后该用户又登录了,那么他之前添加的商品会被复制到其用户帐号下)所以ASP.NET提供了
Profile.MigrateAnonymous事件(只要匿名识别有效且当前用户被验证通过就会触发该事件)可以在Global.asax(全局应用程序文件:该文件包含响应ASP.NET或HTTP 模块所引发的应用程序级别和会话级别事件的代码,只在希望处理应用程序事件或会话事件时,才应创建它)中处理,这这个事件中主要处理3个步骤:1.调用Profile.GetProfile方法获取匿名用户的个性化信息2.将这些个性化信息复制到匿名用户登录后的用户个性化信息里3.移除匿名时的个性化信息,清除匿名标记。
Global.asax中要引用System.Web.Profile,MigrateAnonymous事件代码:
 protected void Profile_OnMigrateAnonymous(object sender, ProfileMigrateEventArgs e)
    {
        //webapp依旧不能用ProfileCommon类,看来这能用利用Web Profile Builder了。
        //获取匿名用户的个性化信息    
        ProfileCommon anonProfile = Profile.GetProfile(e.AnonymousID);
        //将匿名时用户个性化信息复制到用户登录后的个性化信息里
        Profile.用户属性=anonProfile.匿名时属性
        //删除匿名时的个性化信息和匿名识别符
        ProfileManager.DeleteProfile(e.AnonymousID);
        AnonymousIdentificationModule.ClearAnonymousIdentifier();
        //删除匿名时产生的匿名用户
        Membership.DeleteUser(e.AnonymousID,true);
     }
 
自动保存个性化信息
默认ASP.NET每当页面结束生命周期时都会自动保存个性化信息而不管个性化信息是否改变,这会浪费资源。所以我们要设成在只有在改变个性化信息时才在页面结束生命周期时保存个性化信息:
1.将<profile>节点里的automationSaveEnabled="false"就是不让它自动保存个性化信息(也就是我们手动来调用它的保存方法)
2.手动来调用它的保存方法:在改变了个性化信息后显示调用HttpContext.Current.Profile.Save()来手动控制,拿上边的例子来说:
           protected void Button1_Click(object sender, EventArgs e)
        {
           HttpContext.Current.Profile.SetPropertyValue("QQ", TextBox9.Text);
           HttpContext.Current.Profile.SetPropertyValue("Age", int.Parse(DropDownList2.SelectedValue));
           HttpContext.Current.Profile.SetPropertyValue("Tel", TextBox10.Text);
           HttpContext.Current.Profile.SetPropertyValue("Address",TextBox11.Text);
           HttpContext.Current.Profile.Save();   //只是多加这一句
        }

ASP.NET登录控件延伸(个性化)的更多相关文章

  1. ASP.NET登录控件login。

    1.Login控件.通常情况下会出现3个核心元素.用户名文本框.密码输入框.提交凭证的按钮. 1>.比较重要的属性:CreateUserText属性:包含站点注册页的链接文本.CreateUse ...

  2. asp.net Login控件基本属性及事件说明

    原文:asp.net Login控件基本属性及事件说明 Login系列控件是微软为了简化我们的开发过程,为我们进行常规的安全开发提供块捷途径. Login系列控件包含下列控件: Login 登录控件 ...

  3. asp.net分页控件

    一.说明 AspNetPager.dll这个分页控件主要用于asp.net webform网站,现将整理代码如下 二.代码 1.首先在测试页面Default.aspx页面添加引用 <%@ Reg ...

  4. asp.net ajax控件tab扩展,极品啊,秒杀其它插件

    说明:asp.net ajax控件tab要设置width和height,而且在线文本编辑器放能够放入tab中,也必须是asp.net的控件型在线文本,例如fckeditor,下面是我设置好的配置. & ...

  5. javascript获取asp.net服务器端控件的值

    代码如下: <%@ Page Language="C#" CodeFile="A.aspx.cs" Inherits="OrderManage_ ...

  6. ASP.NET控件<ASP:Button /> html控件<input type="button">区别联系

    ASP.NET控件<ASP:Button />-------html控件<input type="button">杨中科是这么说的:asp和input是一样 ...

  7. [ASP.NET]asp.net Repeater控件的使用方法

    asp.net Repeater控件的使用方法 -- : 4770人阅读 评论() 收藏 举报 asp.netserveraspdatasetdeletexhtml 今天学习了,Repeater控件 ...

  8. 关于ASP.net TextBox控件的失去焦点后触发其它事件

    编写人:CC阿爸 2015-2-02 今天在这里,我想与大家一起分享如何处理的ASP.net TextBox控件的失去焦点后触发其它事件的问题,在此做个小结,以供参考.有兴趣的同学,可以一同探讨与学习 ...

  9. 浅谈ASP.NET报表控件

    OWC似乎使用者居多,但看见有网友在帖中抱怨OWC在使用时需要许可证书,于是将其排除,我可不想BOSS在看报表时弹出一个“没有许可证书”的窗口. 接着找到了ComponentOne的Web chart ...

随机推荐

  1. android属性

    一.布局 1.android:layout_gravity和android:gravity的区别 android:gravity 对齐方式,它是相对于控件本身对齐:android:layout_gra ...

  2. pure css做的pc登陆界面

    源码如下: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w ...

  3. 命令行工具cmder

    1.下载地址 http://bliker.github.io/cmder/ 分为两个版本:mini版和Full版 2.快捷命令配置: 比如,快速启动canssandra/redis数据库服务和查询工具 ...

  4. WebService到底是什么?(转)

    一.序言 大家或多或少都听过WebService(Web服务),有一段时间很多计算机期刊.书籍和网站都大肆的提及和宣传WebService技术,其中不乏很多吹嘘和做广告的成分.但是不得不承认的是Web ...

  5. bash: 避免命令重复执行的简单脚本

    1. 根据命令生成md5做为文件名保存当前进程的pid2. 使用exec执行命令3. 如果再次执行, 使用ps -p检测上次pid是否有效, 如果是则exit 200.否则重复1.hadoop@ubu ...

  6. 浅析Objective-C字面量

    编写Objective-C程序时,总会用到某几个类,它们属于Foundation框架.虽然从技术上来说,不用Foundation框架也能写出Objective-C代码,但实际上却经常要用到此框架.这几 ...

  7. 条款24:若所有的函数参数可能都需要发生类型转换才能使用,请采用non-member函数

    假设有一个有理数类Rational,有一个计算有理数乘法的成员函数operator*,示例如下: #include <iostream> class Rational { public: ...

  8. IIS8 web.config 重定向之后 报错 500.19

    原因是没有安装 URL Rewrite 官方下载地址:http://www.iis.net/downloads/microsoft/url-rewrite#additionalDownloads

  9. 数组和字典 swift

    var array = ["A","B"] var array2:[String] = ["A","B"] var ar ...

  10. java读取资源文件

    ResourceBundle bundle = ResourceBundle.getBundle("cn.liuning.resource.MessageResource"); b ...