首页 优化推广 Profile 详解之 ProfileModule 类

Profile 详解之 ProfileModule 类

来源: | 时间:2011/4/9 9:02:20 |

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

服务热线

153 8323 9821

功能和特性

价格和优惠

网站和维护

推广和优化

微信服务号