服务热线
153 8323 9821
Profile 类时用于用户 Profile 的创建和 Profile 事件的管理的,
当启用用户配置文件时,ASP.NET 使用 ProfileModule 来创建用户配置文件,
并且将其存储在当前的 HttpContext 的 Profile 属性中
public sealed class ProfileModule : IHttpModule
从这里的对 ProfileModule 的定义可以看出,
这个 ProfileModule 是实现了 IHttpModule 接口的,
同时其也是一个叶子类,也就是不允许继承,
既然其实现了 IHttpModule 接口的话,那么它便可以拦截住任何的 Request ,
并且可以对这些拦截的 Request 进行修改和控制后再传递给 ASP.NET 处理,
还有需要说明的就是这个 ProfileModule 还公开了三个事件
MSDN 中的说法是
ProfileModule 公开下面的事件,
您可以处理这些事件以在应用程序中配置身份验证:
MigrateAnonymous 事件,
用于在匿名用户登录时将配置文件设置从匿名配置文件
迁移到经过身份验证的配置文件。
Personalize 事件,用于自定义如何创建用户配置文件。
ProfileAutoSaving 事件,
用于在 AutomaticSaveEnabled 属性设置为 true 时
控制如何保存用户配置文件。
上面的三个事件呢,其实有一个事件我在上一篇博文中已经详细的介绍了,
就是从匿名状态转换到登录状态时使用的事件 Profile_MigrateAnonymous ,
还有要提醒的就是上面的这三个事件都是创建在 Global.asax 中的,
分别对应
Profile_MigrateAnonymous()
Profile_Personalize()
Profile_ProfileAutoSaving()
下面就来分别介绍一下
Profile_Personalize()和Profile_ProfileAutoSaving()这两个事件
先来看 Profile_Personalize()事件吧
Personalize 事件的话,
是在 ASP.NET 获取与当前请求相关联的当前状态(如会话状态)时发生,
Personalize 事件呢可以用来指定自定义的 Profile 用户配置文件,
如果在 Personalize 事件结束时,传递给这个事件的参数 args.Profile !=null 的话,
则 ProfileModule 类将使用这个 args.Profile
来作为当前的 HttpContext 的 Profile 属性的值,
在这里我想虽然我说了这么多,可是估计还是有很多人不懂,
那么我就这么说吧,直接说下面将要介绍的 Demo 的大致内容,
比如,一个网站的用户已经有成千上万了,如果,
我对单个的用户都一一使用 Profile 进行设置的话,
这个未免难了点,但是您可以通过角色来管理,
比如我的网站假设现在有 Admin ,SuperAdmin , User 三个角色,
如果我要分别对属于这三个角色中的用户登录时,我要使用不同的 Profile ,
简单点的就比如我要使用不同的背景颜色吧,
当然,您可以在每一个用户在 aspnet_Profile 用户表中都给他添加一个背景颜色,
然后再在每当用户登录时,都使用 Profile . 背景颜色 来读取其存储的颜色,
再修改页面背景色,当然,上面的这种方式是可以实现的,但是未免显得太愚笨,
而且会造成数据库开销增加(
我举的例子只是最简单的一个背景色而已,
如果内容更多的话,那数据库会一下子激增的)
而我再换另外一种方法来试试看,就是使用 Role 来进行管理,
我先对所有的用户进行分类,然后我在每次用户登录时
(会发出 Request 请求,这个可以被 ProfileModule 捕捉到)
都先在 Profile_Personalize 事件中使用其传递进来的参数 ProfileEventArgs args
来得到当前发出请求的 UserName ,
然后就可以根据这个 UserName 来获取其所属的角色,
然后再在数据库中针对其对应的角色取出相对应的 Profile 属性值,
将其赋值给当前的 Profile 对象的这个属性
(也就是修改当前的 Request ,修改完成后再将其交给 ASP.NET 处理),
然后再由 ProfileModule 类将这个属性赋值给当前的 HttpContext 的 Profile 属性值,
这样再在页面上就可以直接通过 Profile 来读取这个背景颜色了,
下面就来看针对这个 Profile_Personalize 事件的 Demo 吧
先看一些准备工作吧,
为了简单起见呢,我是用 ASP.NET 网站管理工具呢又往数据库中添加了三个用户
分别是 SuperAdmin , Admin , Users
并且为它们三个创建了 Profile
做好了准备工作了就该来创建 Profile_Personalize 事件了
在 Global.asax 中创建
<%@ Application Codebehind="Global.asax.cs"
Inherits="WebForm.Global" Language="C#" %>
<script RunAt="server">
//这里在 Global.asax 中定义的 Personalize 事件
void Profile_Personalize(object sender, ProfileEventArgs args)
{
ProfileCommon userProfile;
if (User == null)
{
return;
}
//这里我只针对通过了身份验证的用户,其不包括匿名用户
userProfile = (ProfileCommon)ProfileBase.Create(User.Identity.Name, true);
string[] userRoles = Roles.GetRolesForUser(User.Identity.Name);
if (userRoles.Length > 0)
{
if (userRoles[0] == "SuperAdmin")
{
//从 Profile 中获取 SuperAdmins 用户的 Profile
//作为当前 Request 的 Profile
userProfile = userProfile.GetProfile("SuperAdmins");
}
else if (userRoles[0] == "Admin")
{
userProfile = userProfile.GetProfile("Admins");
}
else if (userRoles[0] == "User")
{
userProfile.GetProfile("Users");
}
//下面就来解释一下为什么会有 SuperAdmins ,Admins ,Users 这几个用户了
//原因是我的网站中有三类角色,既然我要针对这三类角色进行 Profile 的统一管理的话,
//那么我应该在数据库中保存这三类角色的 Profile ,而上面的这三个用户
//实质上并不是作为用户使用的,而是作为存储 Profile 使用的
//就拿 SuperAdmins 来说吧,他的 Profile 代表了所有的 SuperAdmin 的 Profile
//这样就只需要保存一个 SuperAdmins 的用户的 Profile ,而不需要再像以前那样
//要对每一个 SuperAdmin 角色中的用户都独自保存同一份 Profile 了
&nb