asp.net2.0中Membership的扩展

今天看了一下苏鹏老师的Membership扩展的webcast做的小例子。
如果使用 vs2005 提供的 membership 进行用户注册时,里面就那么几个字段,但是如果我们想着增加 qq msn 字段,怎么办?有两种方法
1. 利用 profile profile 可以支持强类型和基本的数据类型;
2. aspnetdb 数据库中新建一张 aspnet_userinfo 表与 aspnet_user 通过 username 进行关联(按视频上来的,还没有测试)
一、利用 profile
1. 配置 web.config
首先,要配置数据库链接字符串( sql2000
< connectionStrings >
    < add  name = "DYJconnectionString="Data Source=.;Initial Catalog=aspnetdb;Persist Security Info=True;user id=sa;password=123providerName="System.Data.SqlClient"/>
  </ connectionStrings >
其次, membership profile
   < profile  enabled = "truedefaultProvider="profileProvider"  >
 
      < providers >
         < add  name = "profileProvidertype="System.Web.Profile.SqlProfileProvider"
  connectionStringName = "DYJ"  />
      </ providers >
      < properties  >
        < add  name = "MSNtype="String"/>
        < add  name = "QQtype="String"/>
      </ properties >
    </ profile >
    < membership >
      < providers >
        < remove  name = "AspNetSqlMembershipProvider" />
        < add  connectionStringName = "DYJenablePasswordRetrieval="false"
           enablePasswordReset = "truerequiresQuestionAndAnswer="true"
           applicationName = "/requiresUniqueEmail="falsepasswordFormat="Hashed"
           maxInvalidPasswordAttempts = "3minRequiredPasswordLength="5"
           minRequiredNonalphanumericCharacters = "0passwordAttemptWindow="10"
           passwordStrengthRegularExpression = "" name="AspNetSqlMembershipProvider"
           type = "System.Web.Security.SqlMembershipProvider, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
      </ providers >
    </ membership >
    < roleManager  enabled = "true" />
这是 web.config 的工作就完了,如果你没有配置 aspnet_regsql 则默认存放在 sql2005 express 数据库中,即你的网站的 app_data 下面的数据库文件中,如果你想修改可以使用 aspnet_regsql 工具进行配置。
 
2. 开始编写代码(主要是 cs 文件, aspx 界面代码主要是几个文本框和按钮)
protected  void  Button1_Click( object  sender,  EventArgs  e)
    {
         MembershipCreateStatus  ms;
         MembershipUser  newuser =  Membership .CreateUser(Uname.Text, Upwd.Text, MSN.Text, SQ.Text, Ans.Text,  true out  ms);
         if  (ms ==  MembershipCreateStatus .Success)
        {
             ProfileCommon  p = ( ProfileCommon ) ProfileCommon .Create(newuser.UserName,  true );
            p.QQ = QQ.Text.Trim();
            p.MSN = MSN.Text.Trim();
            p.Save();
            msg.Text =  "OK" ;
            Server.Transfer( "default.aspx" );
        }
         else
        {
             string  errorcode;
             switch  (ms)
            {
                 case  MembershipCreateStatus .DuplicateUserName:
                    msg.Text =  "Username already exists." ;
                     break ;
 
            }
        }
    }
3. 查看 profile 的信息
   public  DataTable  listalluser() // 可以绑定到 GridView
    {
         DataTable  dt =  new  DataTable ();
        dt.Columns.Add( "username" , System. Type .GetType( "System.String" ));
        dt.Columns.Add( "QQ" , System. Type .GetType( "System.String" ));
        dt.Columns.Add( "msn" , System. Type .GetType( "System.String" ));
 
         MembershipUserCollection  members =  Membership .GetAllUsers();
         foreach  ( MembershipUser  member  in  members)
        {
             DataRow  dr = dt.NewRow();
             MembershipUser  mu =  Membership .GetUser(member.UserName);
             ProfileCommon  p = Profile.GetProfile(member.UserName);
            dr[0] = mu.UserName;
            dr[1] = p.QQ;
            dr[2] = p.MSN;
            dt.Rows.Add(dr);
            dt.AcceptChanges();
        }
         return  dt;
 
}
下面两步实现的功能与 2 3 是一样的,只是实现的方式不一样。下面是利用 vs2005 提供的 CreateUserWizard 控件来实现,唯一值得注意的是,要将控件转化成模板,操作方法:点击右上角的智能箭头,选择“自定义创建用户步骤”,这样就可以加入文本框之类的控件进行操作。哈哈,简单吧,要不说现在的程序员不值钱了呢,工具软件越来越智能,越来越简单了啊,全都成傻瓜型的了!
4. 加入 Profile 属性信息,注意事件,直接双击 CreateUserWizard 控件即可
     protected  void  CreateUserWizard1_CreatedUser( object  sender,  EventArgs  e)
    {
         //TextBox qq = (TextBox)(this.CreateUserWizard1.FindControl("QQ"));
// 虽然新加的文本框在 ContentTemplate 中而且看 aspx 代码与其他的控件也没有什么区别,但是通过上面的方法不能获取到 TextBox 的值,总是返回 null ,查了 N 久资料才找到下面的方法
         TextBox  qq =( TextBox )CreateUserWizard1.CreateUserStep.ContentTemplateContainer.FindControl( "QQ" );
         TextBox  msn = ( TextBox )CreateUserWizard1.CreateUserStep.ContentTemplateContainer.FindControl( "MSN" );
         ProfileCommon  p =
       ( ProfileCommon ) ProfileCommon .Create(CreateUserWizard1.UserName,  true );
        p.QQ= qq.Text;
        p.MSN = msn.Text;
        p.Save();
}
5. 通过 UserName 来获取 Profile 的属性,由于 Profile aspnet_user 表中的 user_id 绑定的,因此可以通过 username 来获取 profile 信息
     protected  void  Button1_Click( object  sender,  EventArgs  e)
    {
         // 通过用户名来获取存储在 profile 表中的 profile 属性值
         MembershipUser  user =  Membership .GetUser( "teng_s2008" );
         ProfileCommon  common = Profile.GetProfile( "teng_s2008" );
        TextBox1.Text = common.MSN;
        TextBox2.Text = common.QQ;
    }
如果安照上面的步骤进行配置后,在数据库 aspnetdb 下面的表
aspnet_applications       aspnet_users   aspnet_profile    aspnet_Membership    中可以看到你刚才增加的记录。  
aspnet_applications:  存储当前系统名称,一般为你解决方案的名称。
Aspnet_user:  存储注册的用户的一些信息,例如用户 ID ,名称。(其它自己看吧)
Aspnet_profile:  存储注册用户的一些个性化参数, ok, 我们可以看到我们定义的 Department, Project 均出现在这个表中,他们被存储在一个字段,一行数据中,以一些分隔符区分。
Aspnet_membership:  存储注册用户的一些细节信息,类似密码等。
但是我作的时候配置了 aspnet_regsql user 信息都可以在数据库中看到,但是 profile 不能看到而且 app_data 下面增加了那个看着就不爽的数据库文件,后来查了查 MSDN ,找到 aspnet_regsql 后面参数的含义,重新执行了一下, OK 了。(由于具体操作不是太清楚,错了也别怪我啊!!)
aspnet_regsql -S (local) -U sa -P 123 -d aspnetdb -A p
S :服务器; U :用户名; P :密码; d: 数据库;- A add p profile
注意大小写
 
哈哈,现在已经 OK 了,另一种方法还没有测试,下班了回家了!数据库中已经有记录了新建一个aspnet_userinfo,但是由于表中有数据不能建立外键关联,以后有时间在接着写了!!
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值