您的位置:首页 > 编程语言 > ASP

ASP.NET 3.5核心编程学习笔记(9):用户配置文件

2011-10-13 14:38 856 查看
用户配置文件简介

  在最抽象的层面,用户配置文件是一种由ASP.NET运行库组织到动态生成类中的属性集合。配置文件数据会按不同的用户分别保存。当程序运行页面被显示时,ASP.NET会动态创建配置文件对象,它包含开发者定义在数据模型中的相应类型的属性。该对象之后被添加到HttpContext对象中,可通过Profile属性获取。

数据模型的定义

  为使用ASP.NET配置文件,我们需要先确定所要使用的数据模型结构,然后将该数据模型通过配置文件附在页面中。用户配置文件的布局定义在web.config文件中。

  示例代码:

<system.web>
......
<profile>
<properties>
<add name="BackColor" type="string" />
<add name="ForeColor" type="string" />
</properties>
</profile>
</system.web>


  所有通过<add>标签添加的属性会变为动态创建类的成员。



  配置文件中的用户配置会被自动生成一个类,如下所示:

namespace ASP
{
public class ProfileCommon : ProfileBase
{
public virtual string BackColor
{
get { (string)GetPropertyValue("BackColor"); }
set { SetPropertyValue("BackColor", value); }
}
public virtual string ForeColor
{
get{ (string)GetPropertyValue("ForeColor"); }
set{ SetPropertyValue("ForeColor", value); }
}
public virtual ProfileCommon GetProfile(string username)
{
object o = ProfileBase.Create(username);
return (ProfileCommon)o;
}
......
}
}


  该类的实例会自动与Page类的Profile属性相关联,我们可通过Profile.BackColor这类语法来访问用户配置文件的属性。

集合类型的使用

  在上例中,我们使用的是单一的标量值,然后用户配置文件支持更高级的功能--集合类型和自定义类型。先看一下集合类型:

<properties>
<add name="Links"
type="System.Collections.Specialized.StringCollection" />
</properties>


  非标量值必须按存储介质的要求进行序列化。serializeAs属性就是用于指示如何进行序列化的。该属性可取的值有String、Xml、Binary、ProviderSpecific。如果该属性值未被指定,默认类型为String。

自定义类型的使用

  只要自定义类型为可序列化类型,就能被用户配置文件所使用。我们可自己设计类,将其编译为程序集,然后将程序集名称添加到配置文件属性的类型信息中:

<properties>
<add name="ShoopingCart"
type="My.Namespace.DataContainer, MyAssembly" />
</properties>


属性的分组

  <properties>区段可接受<group>元素,它允许我们对之间相关的属性进行组织。

  示例代码:

<properties>    ......
<group name="Font">        <addd name="Name" type="string" defaultValue="verdana" />        <addd name="SizeInPoints" type="int" defaultValue="8" />

</group>
</properties>


与页面的交互

  为启用或禁用用户配置文件功能,我们只需设置web.config文件<profile>元素的enabled属性。如果该值为false,则页面不能使用Profile属性。

匿名用户的处理

  虽然用户配置文件功能主要是为被验证用户设计的,但也能够存储匿名用户的配置文件数据。要启用匿名用户,首先要开启anonymousIdentification功能。

  示例代码:

<system.web>
......  <anonymousIdentification enabled="true" />
<profile>
<properties>
<add name="BackColor" type="string" allowAnonymous="true" />
<add name="ForeColor" type="string" />
</properties>
</profile>
</system.web>


  上述示例使匿名用户可设置背景颜色但不能设置前景颜色。

用户配置文件属性的访问

  在请求被处理前,ASP.NET会根据web.config文件中定义的用户配置文件信息动态创建一个类,页面的Profile属性会被设置为该类的实例。

个性化相关事件

  请求进入处理周期之前,个性化数据会被添加到某请求的HTTP上下文中,但哪个系统组件负责个性化数据的加载呢?为此,ASP.NET引入了一种新的模块ProfileModule。

  该模块本身有一对事件,分别在请求被谁后和请求即将结束时引发。如果个性化功能被关闭,该模块会立即返回,否则它会向应用程序引发Personalize事件,并加载当前用户配置文件中的个性化数据。在Personalize事件被引发时,个性化数据尚未加载。由HTTP模块引发的事件处理程序必须编写在global.asax中。

void Profile_Personalize(object sender, ProfileEventArgs e)
{
ProfileCommon profile = null

//如果当前用户为匿名用户,退出
if(User == null) return;

//管理员用户
if(User.IsInRole("Administrators"))
profile = (ProfileCommon)ProfileBase.Create("Administrator");
else
profile = (ProfileCommon)ProfileBase.Create("User");

if(profile != null)
e.Profile = profile;
}


匿名用户数据的迁移

  通过分配给匿名用户唯一的ID,匿名用户也能存储和获取配置信息。但如果在某一时刻,该匿名用户决定在网站中创建一个帐户,就需要将其作为匿名用户时设置的配置信息迁移到新帐户上。

  当用户以匿名身份转而登录实名帐户时,个性化模块会引发MigrateAnonymous事件。合理处理该全局事件,能将匿名用户的设置导入已验证用户的配置文件中。

  示例代码:

void Profile_MigrateAnonymous(object sender, ProfileMigrateEventArgs e)
{
//获取匿名用户配置文件
ProfileCommon anonProfile;
anonProfile = Profile.GetProfile(e.AnonymousId);

//迁移匿名用户配置文件到实名用户帐户上
Profile.BackColor = anonProfile.BackColor;
......
}


用户配置文件提供程序

  用户配置文件由两部分构成:访问层和存储层。

  访问层提供了一个强类型模型,用于获取和设置属性值,还可以对用户身份进行管理。它会确保获取和存储的数据针对的是当前已登录的用户。

  存储导使用特殊的提供程序来执行与存取数据有关的任务。

用户配置文件提供程序的配置

  默认的提供程序由web.config文件描述相应功能区段的defaultProvider属性指定。默认情况下,如果未指定提供程序,将默认使用特定功能提供程序集合中的第一项。

  默认配置文件提供程序名为AspNetSqlProfileProvider,使用SQL Server 2005 Express作为数据存储。如下所示:

<profile>
<providers>
<add name="AspNetSqlProfileProvider"
ConnectionStringName="LocalSqlServer"
applicationName="/"
type="System.Web.Profile.SqlProfileProvider" />
</providers>
</profile>


  上述代码摘自machine.config文件。这里的LocalSqlServer不是到本地或远程SQL Server实例的连接字串,而是配置文件<connectionStrings>区段中的数据项名称。

自定义的用户配置文件提供程序

  我们可以编写自定义的用户配置文件提供程序,但自定义的用户配置文件提供程序类应继承于ProfileProvider类。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: