今天看了一下苏鹏老师的Membership扩展的webcast做的小例子。
如果使用
vs2005
提供的
membership
进行用户注册时,里面就那么几个字段,但是如果我们想着增加
qq
与
msn
字段,怎么办?有两种方法
1.
利用
profile
,
profile
可以支持强类型和基本的数据类型;
2.
在
aspnetdb
数据库中新建一张
aspnet_userinfo
表与
aspnet_user
通过
username
进行关联(按视频上来的,还没有测试)
一、利用
profile
1.
配置
web.config
首先,要配置数据库链接字符串(
sql2000
)
<
connectionStrings
>
<
add
name
=
"DYJ" connectionString="Data Source=.;Initial Catalog=aspnetdb;Persist Security Info=True;user id=sa;password=123" providerName="System.Data.SqlClient"/>
</
connectionStrings
>
其次,
membership
和
profile
<
profile
enabled
=
"true" defaultProvider="profileProvider" >
<
providers
>
<
add
name
=
"profileProvider" type="System.Web.Profile.SqlProfileProvider"
connectionStringName
=
"DYJ" />
</
providers
>
<
properties
>
<
add
name
=
"MSN" type="String"/>
<
add
name
=
"QQ" type="String"/>
</
properties
>
</
profile
>
<
membership
>
<
providers
>
<
remove
name
=
"AspNetSqlMembershipProvider" />
<
add
connectionStringName
=
"DYJ" enablePasswordRetrieval="false"
enablePasswordReset
=
"true" requiresQuestionAndAnswer="true"
applicationName
=
"/" requiresUniqueEmail="false" passwordFormat="Hashed"
maxInvalidPasswordAttempts
=
"3" minRequiredPasswordLength="5"
minRequiredNonalphanumericCharacters
=
"0" passwordAttemptWindow="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,但是由于表中有数据不能建立外键关联,以后有时间在接着写了!!