这两天做一个小项目,需要把用户在注册的时候填入的个人信息保存到Profile中,自然而然的想到要自定义CreateUserWizard控件的创建用户步骤(CreateUserWizardStep),现在把我的实现过程写下来,跟大家探讨一下。
一 . 在web.config中定义Profile字段,设置各字段的allowAnonymous="true"。
<profile enabled="true">
<properties>
<group name="address">
<add name="Name" allowAnonymous="true"/>
<add name="Address" allowAnonymous="true"/>
<add name="Province" allowAnonymous="true"/>
<add name="City" allowAnonymous="true"/>
<add name="PostCode" allowAnonymous="true"/>
<add name="Telephone" allowAnonymous="true"/>
</group>
</properties>
</profile>
二. 建一个web窗体,拖入一个CreateUserWizard,自定义其创建用户步骤,创建用户后,此用户会自动登录LoginCreatedUser="true"
,代码如下:
<asp:CreateUserWizard
id="CreateUserWizard1"
CompleteSuccessText="完成您的注册!"
LoginCreatedUser="true"
Runat="server" OnCreatedUser="CreateUserWizard1_CreatedUser">
<WizardSteps>
<asp:CreateUserWizardStep runat="server">
<ContentTemplate>
<table border="0">
<tr>
<td align="center" colspan="2">
注册新帐户</td>
</tr>
<tr>
<td align="right">
<asp:Label ID="UserNameLabel" runat="server" AssociatedControlID="UserName">用户名:</asp:Label></td>
<td>
<asp:TextBox ID="UserName" runat="server"></asp:TextBox>
<asp:RequiredFieldValidator ID="UserNameRequired" runat="server" ControlToValidate="UserName"
ErrorMessage="必须填写“用户名”。" ToolTip="必须填写“用户名”。" ValidationGroup="CreateUserWizard1">*</asp:RequiredFieldValidator>
</td>
</tr>
<tr>
<td align="right">
<asp:Label ID="PasswordLabel" runat="server" AssociatedControlID="Password">密码:</asp:Label></td>
<td>
<asp:TextBox ID="Password" runat="server" TextMode="Password"></asp:TextBox>
<asp:RequiredFieldValidator ID="PasswordRequired" runat="server" ControlToValidate="Password"
ErrorMessage="必须填写“密码”。" ToolTip="必须填写“密码”。" ValidationGroup="CreateUserWizard1">*</asp:RequiredFieldValidator>
</td>
</tr>
<tr>
<td align="right">
<asp:Label ID="ConfirmPasswordLabel" runat="server" AssociatedControlID="ConfirmPassword">确认密码:</asp:Label></td>
<td>
<asp:TextBox ID="ConfirmPassword" runat="server" TextMode="Password"></asp:TextBox>
<asp:RequiredFieldValidator ID="ConfirmPasswordRequired" runat="server" ControlToValidate="ConfirmPassword"
ErrorMessage="必须填写“确认密码”。" ToolTip="必须填写“确认密码”。" ValidationGroup="CreateUserWizard1">*</asp:RequiredFieldValidator>
</td>
</tr>
<tr>
<td align="right">
<asp:Label ID="EmailLabel" runat="server" AssociatedControlID="Email">电子邮件:</asp:Label></td>
<td>
<asp:TextBox ID="Email" runat="server"></asp:TextBox>
<asp:RequiredFieldValidator ID="EmailRequired" runat="server" ControlToValidate="Email"
ErrorMessage="必须填写“电子邮件”。" ToolTip="必须填写“电子邮件”。" ValidationGroup="CreateUserWizard1">*</asp:RequiredFieldValidator>
</td>
</tr>
<tr>
<td align="right">
<asp:Label ID="QuestionLabel" runat="server" AssociatedControlID="Question">安全提示问题:</asp:Label></td>
<td>
<asp:TextBox ID="Question" runat="server"></asp:TextBox>
<asp:RequiredFieldValidator ID="QuestionRequired" runat="server" ControlToValidate="Question"
ErrorMessage="必须填写“安全提示问题”。" ToolTip="必须填写“安全提示问题”。" ValidationGroup="CreateUserWizard1">*</asp:RequiredFieldValidator>
</td>
</tr>
<tr>
<td align="right">
<asp:Label ID="AnswerLabel" runat="server" AssociatedControlID="Answer">安全答案:</asp:Label></td>
<td>
<asp:TextBox ID="Answer" runat="server"></asp:TextBox>
<asp:RequiredFieldValidator ID="AnswerRequired" runat="server" ControlToValidate="Answer"
ErrorMessage="必须填写“安全答案”。" ToolTip="必须填写“安全答案”。" ValidationGroup="CreateUserWizard1">*</asp:RequiredFieldValidator>
</td>
</tr>
<tr>
<td align="center" colspan="2">
<asp:CompareValidator ID="PasswordCompare" runat="server" ControlToCompare="Password"
ControlToValidate="ConfirmPassword" Display="Dynamic" ErrorMessage="“密码”和“确认密码”必须匹配。"
ValidationGroup="CreateUserWizard1"></asp:CompareValidator>
</td>
</tr>
<tr>
<td align="right">
收货人:</td>
<td>
<asp:TextBox ID="txtName" runat="server"></asp:TextBox>
</td>
</tr>
<tr>
<td align="right">
收货人地址:</td>
<td>
<asp:TextBox ID="txtAddress" runat="server"></asp:TextBox>
</td>
</tr>
<tr>
<td align="right">
省份:</td>
<td>
<asp:TextBox ID="txtProvince" runat="server"></asp:TextBox>
</td>
</tr>
<tr>
<td align="right">
城市:</td>
<td>
<asp:TextBox ID="txtCity" runat="server"></asp:TextBox>
</td>
</tr>
<tr>
<td align="right">
邮编:</td>
<td>
<asp:TextBox ID="txtPostCode" runat="server"></asp:TextBox>
</td>
</tr>
<tr>
<td align="right">
电话:</td>
<td>
<asp:TextBox ID="txtTelephone" runat="server"></asp:TextBox>
</td>
</tr>
<tr>
<td align="center" colspan="2" style="color: red">
<asp:Literal ID="ErrorMessage" runat="server" EnableViewState="False"></asp:Literal>
</td>
</tr>
</table>
</ContentTemplate>
</asp:CreateUserWizardStep>
<asp:CompleteWizardStep runat="server" Title="">
</asp:CompleteWizardStep>
</WizardSteps>
</asp:CreateUserWizard>
三.在CreatedUser事件中保存个人信息,在此遇到的问题,主要是如何获取 CreateUserStep中的那些TextBox
protected void CreateUserWizard1_CreatedUser(object sender, EventArgs e)
{
Profile.address.Name = ((TextBox)(CreateUserWizard1.CreateUserStep.ContentTemplateContainer.FindControl("txtName"))).Text;
Profile.address.Address = ((TextBox)(CreateUserWizard1.CreateUserStep.ContentTemplateContainer.FindControl("txtAddress"))).Text;
Profile.address.Province = ((TextBox)(CreateUserWizard1.CreateUserStep.ContentTemplateContainer.FindControl("txtProvince"))).Text;
Profile.address.City = ((TextBox)(CreateUserWizard1.CreateUserStep.ContentTemplateContainer.FindControl("txtCity"))).Text;
Profile.address.PostCode = ((TextBox)(CreateUserWizard1.CreateUserStep.ContentTemplateContainer.FindControl("txtPostCode"))).Text;
Profile.address.Telephone = ((TextBox)(CreateUserWizard1.CreateUserStep.ContentTemplateContainer.FindControl("txtTelephone"))).Text;
}
四。在上面CreatedUser事件中保存的是匿名用户的信息,需要在Global.asax文件中设置迁移匿名用户的程序,在此要注意的是 if (!string.IsNullOrEmpty(anoProfile.address.Name)),要确保进行此判断,不然若匿名用户的Profile为空,用户登录后其原先的profile信息就会被覆盖了
void Profile_OnMigrateAnonymous(object sender, ProfileMigrateEventArgs e)
{
// 获取匿名用户的profile
ProfileCommon anoProfile = Profile.GetProfile(e.AnonymousID);
if (!string.IsNullOrEmpty(anoProfile.address.Name))
{
Profile.address.Name = anoProfile.address.Name;
Profile.address.Address = anoProfile.address.Address;
Profile.address.Province = anoProfile.address.Province;
Profile.address.City = anoProfile.address.City;
Profile.address.PostCode = anoProfile.address.PostCode;
Profile.address.Telephone = anoProfile.address.Telephone;
Profile.Save();
}
ProfileManager.DeleteProfile(e.AnonymousID);
AnonymousIdentificationModule.ClearAnonymousIdentifier();
}
备注:上面在CreatedUser事件中保存的是匿名用户的Profile信息,如果在CreateUserWizard1_ContinueButtonClick事件中则保存的是注册用户的Profile信息,这样