上个专题我们讲到了Membership,了解了Membership可以让我们轻松的实现用户注册、登录、删除用户、用户更改密码等等一系列关于用户的基本操作,但是对于一个面向多用户的web程序,为了满足用户在访问站点时能够根据自己的喜好定制web站点的一些页面布局、皮肤,语言等等一些信息,Membership是不能满足要求的,因此,在CS中引入了Profile,Profile并不是为了实现用户个性化的机制,只是实现了个性化信息存储(在asp.net 2.0 beat2.0中页面的个性化可以用webpart实现的),目前CS的版本中还没有实现这个功能。但是我想,CS实现页面布局的个性化是迟早的事情,如果有可能,我会在CS专题结束后做一些asp.net 2.0 webpart的讲解。 CS中的Profile存储的主要是注册用户的email、timezone(时区)、日期格式、字体大小等等。通过这些信息CS就可以给注册并且登录后的用户个性化他们设置的页面,如:选择的皮肤、语言、字体大小,日期格式。 以显示日期格式为例,我们看看Profile给我们带来的效果: 我们先在CS中设置日期格式如下: 可以看到CS论坛中的日期格式如下: 接下来,设置过另外一个格式: 在论坛中可以看到格式也改变了: 如果你注销后,日期格式又会发生改变(改变为默认日期格式),也就是说这种设置完全是个人的。 当然,要实现这样的功能需要构建复杂的代码,Profile机制在这里仅仅提供数据的存储服务,这个专题我们只分析Profile机制是如何提供存储服务的。 先看看配置文件: <profile enabled="true"> <providers> <add name="CommunityServerSqlProvider" type="CommunityServer.Components.CSProfileProvider, CommunityServer.Components" connectionStringName="SiteSqlServer" applicationName="dev" description="Stores and retrieves profile data from the local Microsoft SQL Server database" /> </providers> <properties> <add name ="commonName" type ="string"/> <add name ="birthdate" type ="DateTime"/> <add name ="gender" type ="int" defaultValue ="0"/> <add name ="dateFormat" type ="string" defaultValue="yyyy-MM-dd"/> <add name ="publicEmail" type ="string"/> <add name ="language" type ="string"/> <add name ="webAddress" type ="string"/> <add name ="webLog" type ="string"/> <add name ="signature" type ="string"/> <add name ="signatureFormatted" type ="string"/> <add name ="location" type ="string"/> <add name ="occupation" type ="string"/> <add name ="interests" type ="string"/> <add name ="msnIM" type ="string"/> <add name ="yahooIM" type ="string"/> <add name ="aolIM" type ="string"/> <add name ="icqIM" type ="string"/> <add name ="qqIM" type ="string"/> <add name ="enablePostPreviewPopup" type ="System.Boolean" defaultValue ="false"/> <add name ="enableEmoticons" type ="System.Boolean" defaultValue ="true"/> <add name ="timezone" type ="System.Double" defaultValue="0"/> <add name ="fontsize" type ="int" defaultValue ="0"/> </properties> </profile> < providers >节点下的内容我就不多说了。<properties>节点是配置的关键,该节点下面的信息就是一个注册用户可以存储的个性化信息。name是存储的名称,type是该名称保存数据的类型(其实还有一些信息可有可无,比如defaultValue等,表示默认值)。 用Reflector打开MemberRole,可以看到相比Membership,profile在类结构方面复杂很多,其实往往数据库设计的越简单,处理数据的类就越复杂。与Membership一样,通过实现 IConfigurationSectionHandler接口来读取在Web.config中配置。先实例化一个ProfileConfig,用来存储Providers节点下的信息和Properties节点下信息。 publicclass ProfileConfig beta2中的membership操作并不简单,反而复杂化,比如:如果添加一个字段,需要对UI做不小的改动。我也有这样的感觉,但是当把membership与webpart结合在一起,那么可以实现一种从数据操作,到业务逻辑,再到UI的全过程实现。也就是说,如果开发一个webpart用来处理profile,当增加profile内容的时候,UI根据增加的信息,自动的在UI上生成内容的现实与设置,那就一劳永逸了。