服務(wù)熱線
153 8323 9821
Profile 類時用于用戶 Profile 的創(chuàng)建和 Profile 事件的管理的,
當(dāng)啟用用戶配置文件時,ASP.NET 使用 ProfileModule 來創(chuàng)建用戶配置文件,
并且將其存儲在當(dāng)前的 HttpContext 的 Profile 屬性中
public sealed class ProfileModule : IHttpModule
從這里的對 ProfileModule 的定義可以看出,
這個 ProfileModule 是實現(xiàn)了 IHttpModule 接口的,
同時其也是一個葉子類,也就是不允許繼承,
既然其實現(xiàn)了 IHttpModule 接口的話,那么它便可以攔截住任何的 Request ,
并且可以對這些攔截的 Request 進(jìn)行修改和控制后再傳遞給 ASP.NET 處理,
還有需要說明的就是這個 ProfileModule 還公開了三個事件
MSDN 中的說法是
ProfileModule 公開下面的事件,
您可以處理這些事件以在應(yīng)用程序中配置身份驗證:
MigrateAnonymous 事件,
用于在匿名用戶登錄時將配置文件設(shè)置從匿名配置文件
遷移到經(jīng)過身份驗證的配置文件。
Personalize 事件,用于自定義如何創(chuàng)建用戶配置文件。
ProfileAutoSaving 事件,
用于在 AutomaticSaveEnabled 屬性設(shè)置為 true 時
控制如何保存用戶配置文件。
上面的三個事件呢,其實有一個事件我在上一篇博文中已經(jīng)詳細(xì)的介紹了,
就是從匿名狀態(tài)轉(zhuǎn)換到登錄狀態(tài)時使用的事件 Profile_MigrateAnonymous ,
還有要提醒的就是上面的這三個事件都是創(chuàng)建在 Global.asax 中的,
分別對應(yīng)
Profile_MigrateAnonymous()
Profile_Personalize()
Profile_ProfileAutoSaving()
下面就來分別介紹一下
Profile_Personalize()和Profile_ProfileAutoSaving()這兩個事件
先來看 Profile_Personalize()事件吧
Personalize 事件的話,
是在 ASP.NET 獲取與當(dāng)前請求相關(guān)聯(lián)的當(dāng)前狀態(tài)(如會話狀態(tài))時發(fā)生,
Personalize 事件呢可以用來指定自定義的 Profile 用戶配置文件,
如果在 Personalize 事件結(jié)束時,傳遞給這個事件的參數(shù) args.Profile !=null 的話,
則 ProfileModule 類將使用這個 args.Profile
來作為當(dāng)前的 HttpContext 的 Profile 屬性的值,
在這里我想雖然我說了這么多,可是估計還是有很多人不懂,
那么我就這么說吧,直接說下面將要介紹的 Demo 的大致內(nèi)容,
比如,一個網(wǎng)站的用戶已經(jīng)有成千上萬了,如果,
我對單個的用戶都一一使用 Profile 進(jìn)行設(shè)置的話,
這個未免難了點,但是您可以通過角色來管理,
比如我的網(wǎng)站假設(shè)現(xiàn)在有 Admin ,SuperAdmin , User 三個角色,
如果我要分別對屬于這三個角色中的用戶登錄時,我要使用不同的 Profile ,
簡單點的就比如我要使用不同的背景顏色吧,
當(dāng)然,您可以在每一個用戶在 aspnet_Profile 用戶表中都給他添加一個背景顏色,
然后再在每當(dāng)用戶登錄時,都使用 Profile . 背景顏色 來讀取其存儲的顏色,
再修改頁面背景色,當(dāng)然,上面的這種方式是可以實現(xiàn)的,但是未免顯得太愚笨,
而且會造成數(shù)據(jù)庫開銷增加(
我舉的例子只是最簡單的一個背景色而已,
如果內(nèi)容更多的話,那數(shù)據(jù)庫會一下子激增的)
而我再換另外一種方法來試試看,就是使用 Role 來進(jìn)行管理,
我先對所有的用戶進(jìn)行分類,然后我在每次用戶登錄時
(會發(fā)出 Request 請求,這個可以被 ProfileModule 捕捉到)
都先在 Profile_Personalize 事件中使用其傳遞進(jìn)來的參數(shù) ProfileEventArgs args
來得到當(dāng)前發(fā)出請求的 UserName ,
然后就可以根據(jù)這個 UserName 來獲取其所屬的角色,
然后再在數(shù)據(jù)庫中針對其對應(yīng)的角色取出相對應(yīng)的 Profile 屬性值,
將其賦值給當(dāng)前的 Profile 對象的這個屬性
(也就是修改當(dāng)前的 Request ,修改完成后再將其交給 ASP.NET 處理),
然后再由 ProfileModule 類將這個屬性賦值給當(dāng)前的 HttpContext 的 Profile 屬性值,
這樣再在頁面上就可以直接通過 Profile 來讀取這個背景顏色了,
下面就來看針對這個 Profile_Personalize 事件的 Demo 吧
先看一些準(zhǔn)備工作吧,
為了簡單起見呢,我是用 ASP.NET 網(wǎng)站管理工具呢又往數(shù)據(jù)庫中添加了三個用戶
分別是 SuperAdmin , Admin , Users
并且為它們?nèi)齻€創(chuàng)建了 Profile
做好了準(zhǔn)備工作了就該來創(chuàng)建 Profile_Personalize 事件了
在 Global.asax 中創(chuàng)建
<%@ 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
//作為當(dāng)前 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 這幾個用戶了
//原因是我的網(wǎng)站中有三類角色,既然我要針對這三類角色進(jìn)行 Profile 的統(tǒng)一管理的話,
//那么我應(yīng)該在數(shù)據(jù)庫中保存這三類角色的 Profile ,而上面的這三個用戶
//實質(zhì)上并不是作為用戶使用的,而是作為存儲 Profile 使用的
//就拿 SuperAdmins 來說吧,他的 Profile 代表了所有的 SuperAdmin 的 Profile
//這樣就只需要保存一個 SuperAdmins 的用戶的 Profile ,而不需要再像以前那樣
//要對每一個 SuperAdmin 角色中的用戶都獨自保存同一份 Profile 了
&nb