17.4 编程访问个性化功能
在调用ASP.NET页面时,ASP.NET创建了一个ProfileCommon类,该类继承了ProfileBase类,用于强类型化在web.config文件中定义的profile属性。这个类可以处理用户的配置文件存储,使用ProfileBase类中的GetPropertyValue和SetPropertyValue方法获取和设置profile属性。
ASP.NET使用ProfileModule类提供了获取特定Profile事件所必需的关联。ASP.NET使用ProfileModule类在页面的Profile对象中创建和存储配置文件信息。
ProfileModule类有3个事件,可用于处理用户的配置文件。这些事件分别是MigrateAnonymous、Personalize和ProfileAutoSaving,主要用于身份验证。前面介绍了如何在应用程序中处理匿名用户,所以下面先探讨如何把这些用户变成通过验证的用户——因为我们常常要移动它们的profile属性和修改它们的状态。
17.4.1 迁移匿名用户
在处理匿名用户时,必须把匿名用户变成注册用户。例如,终端用户填满了购物车后,就可以在站点上注册,以购买这些商品。此时,终端用户就要从匿名用户变成注册用户。
所以,ASP.NET 2.0提供了Profile_MigrateAnonymous事件,将匿名用户变成注册用户。Profile_MigrateAnonymous事件需要一个ProfileMigrateEventArgs类型的事件委托。它放在处理迁移的页面上或Global.asax文件中(可以在应用程序的任何地方使用)。这个事件的使用如程序清单17-17所示。
程序清单17-17 为特定的个性化属性迁移匿名用户
VB
Public Sub Profile_MigrateAnonymous(ByVal sender As Object, _
ByVal e As ProfileMigrateEventArgs)
Profile.LastVisited = Profile.GetPropertyValue(e.AnonymousID).LastVisited
End Sub
C#
public void Profile_MigrateAnonymous(object sender,
ProfileMigrateEventArgs e)
{
Profile.LastVisited =
Profile.GetPropertyValue(e.AnonymousID).LastVisited.ToString();
}
在这个例子中用旧属性填充新的Profile属性。使用GetPropertyValue属性获取匿名用户的旧属性,该GetPropertyValue属性把匿名用户的ID作为参数。在Profile_Migrate Anonymous事件中,仍可以访问AnonymousID属性,该属性从ProfileMigrateEventArgs事件委托中获得。
程序清单17-17演示了如何把一个个性化属性从匿名用户迁移到新的注册用户上。除了迁移单个属性之外,还可以迁移个性化组中的属性,如程序清单17-18所示。
程序清单17-18 为个性化组中的项迁移匿名用户
VB
Public Sub Profile_MigrateAnonymous(ByVal sender As Object, _
ByVal e As ProfileMigrateEventArgs)
Dim au As System.Web.Profile.ProfileBase = Profile.GetProfile(e.AnonymousID)
If au.MemberDetails.DateJoined <> "" Then
Profile.MemberDetails.DateJoined = DateTime.Now().ToString()
Profile.FamilyDetails.MarriedStatus = au.FamilyDetails.MarriedStatus
End If
AnonymousIdentificationModule.ClearAnonymousIdentifier()
End Sub
C#
public void Profile_MigrateAnonymous(object sender,
ProfileMigrateEventArgs e)
{
System.Web.Profile.ProfileBase au = Profile.GetProfile(e.AnonymousID);
if (au.MemberDetails.DateJoined != String.Empty) {
Profile.MemberDetails.DateJoined = DateTime.Now.ToString();
Profile.FamilyDetails.MarriedStatus = au.FamilyDetails.MarriedStatus;
}
AnonymousIdentificationModule.ClearAnonymousIdentifier();
}
使用页面或Global.asax文件中的这个事件,可以在匿名用户在应用程序中注册时,有条理地迁移他们。迁移过程还允许选择要迁移的项,并按照需要修改其值。
17.4.2 profile的个性化
除了处理Global.asax文件中的匿名用户之外,还可以用编程的方式个性化从个性化库中提取出来的配置信息。这可以使用Profile_Personalize事件来完成,这个事件的使用示例如程序清单17-19所示。
程序清单17-19 个性化所提取的配置文件
VB
Public Sub Profile_Personalize(sender As Object, args As ProfileEventArgs)
Dim checkedProfile As ProfileCommon
If User Is Nothing Then Return
checkedProfile = CType(ProfileBase.Create(User.Identity.Name), ProfileCommon)
If (Date.Now.IsDaylightSavingTime()) Then
checkedProfile = checkedProfile.GetProfile("TimeDifferenceUser")
Else
checkedProfile = checkedProfile.GetProfile("TimeUser")
End If
If Not checkedProfile Is Nothing Then _
args.Profile = checkedProfile
End Sub
C#
public void Profile_Personalize(object sender, ProfileEventArgs args)
{
ProfileCommon checkedProfile;
if (User == null) { return; }
checkedProfile = (ProfileCommon)ProfileBase.Create(User.Identity.Name);
if (DateTime.Now.IsDaylightSavingTime()) {
checkedProfile = checkedProfile.GetProfile("TimeDifferenceUser");
}
else {
checkedProfile = checkedProfile.GetProfile("TimeUser");
}
if (userProfile != null) {
args.Profile = userProfile;
}
}
在这个例子中,根据特定的参数(无论它是Daylight Savings Time还是其他值),都可以把特定的配置文件赋予用户。为此,可使用ProfileBase.Personalize事件,通常该事件位于Global.asax页面中。
17.4.3 确定是否继续自动保存profile值
在使用ASP.NET提供的profile功能时,页面会在执行结束时,把profile值自动保存到特定的数据库中。这个功能默认为启用状态(设置为true),也可以在web.config文件使用<profile>节点中的automaticSaveEnabled属性,把它设置为false,如程序清单17-20所示。
程序清单17-20 使用automaticSaveEnabled属性
<profile automaticSaveEnabled="False">
<properties>
<add name="FirstName" />
<add name="LastName" />
<add name="LastVisited" />
<add name="Age" />
<add name="Member" />
</properties>
</profile>
如果把automaticSaveEnabled属性设置为false,就必须调用ProfileBase.Save()方法。但在大多数情况下,应把这个属性设置为true。在发出页面请求并处理完后,就会触发ProfileModule.ProfileAutoSaving事件。也可以利用这个事件来禁用自动保存功能,如程序清单17-21所示。
程序清单17-21 使用ProfileAutoSaving事件禁用自动保存功能
VB
Public Sub Profile_ProfileAutoSaving(sender As Object, _
args As ProfileAutoSaveEventArgs)
If Profile.PaidDueStatus.HasChanged Then
args.ContinueWithProfileAutoSave = true
Else
args.ContinueWithProfileAutoSave = false
End If
End Sub
C#
public void Profile_ProfileAutoSaving(object sender, ProfileAutoSaveEventArgs args)
{
if (Profile.PaidDueStatus.HasChanged)
args.ContinueWithProfileAutoSave = true;
else
args.ContinueWithProfileAutoSave = false;
}
在这个例子中,触发Profile_ProfileAutoSaving事件时,就可以在该事件中修改一些行为。程序清单17-21检查Profile.PaidDueStatus属性是否已改变。如果已改变,配置文件就继续启用系统的自动保存功能;如果Profile.PaidDueStatus没有改变,就禁用自动保存功能。







