7.1 使用Profile製作個人化頁面
一個人性化的網站往往提供給使用者很多個人化選擇。比如讓使用者選擇所喜歡的網站風格,讓使用者選擇是否自動彈出訊息提醒等。這些資料需要在使用者把瀏覽器關閉後還能儲存下來,因此只能選擇資料庫進行儲存。對於登入過的使用者比較好辦,我們可以根據使用者名稱和使用者的選擇存放在資料庫中,對於非登入使用者(匿名使用者)怎麼儲存使用者的選擇呢?唯一的方法只能像Session那樣分配給使用者一個ID,把這個ID存放在Cookie中(當然也可以放在URL中),然後在資料庫中儲存這個ID相關的一些配置資訊。
ASP.NET 2.0提供了Profile機制,能協助我們完成類似的功能。Profile不僅僅支援登入使用者還支援匿名使用者,儲存的資料也可以是任何可序列化類別型。幾乎無需寫一行代碼就能輕鬆實現使用者個人化資料的儲存。我們配置了一個Web.config檔案,如下所示。
<?xml version="1.0"?>
<configuration>
<system.web>
<anonymousIdentification enabled="true"/>
<profile automaticSaveEnabled="true">
<properties>
<group name="UI">
<add name="ForeColor" defaultValue="Black" allowAnonymous="true" type="string"/>
<add name="EnableBold" defaultValue="false" allowAnonymous="true" type="bool"/>
</group>
<group name="UserInfo">
<add name="UserName" defaultValue="" allowAnonymous="false" type="string"/>
<add name="UserAge" defaultValue="0" allowAnonymous="false" type="int"/>
</group>
</properties>
</profile>
<compilation debug="true"/>
<authentication mode="Forms"/>
</system.web>
</configuration>
· <anonymousIdentification enabled="true"/>表示對匿名使用者也啟用Profile,系統會給匿名使用者分配一個隨機字串組成的ID。
· <profile automaticSaveEnabled="true">表示自動在頁面請求結束的時候儲存Profile的設定到資料庫中。
· <properties>中就是正式定義Profile的格式了,我們使用<group>標籤把Profile分成了兩組,<group name="UI">和<group name="UserInfo">。
· 在每一個<group>中的才是真正的Profile。name表示Profile的名字,defaultValue表示預設值,allowAnonymous表示匿名使用者是否可以使用,type表示資料類型。
· <authentication mode="Forms"/>表示為系統啟用了表單認證(這是ASP.NET認證方式的一種,以後的章節中會詳細介紹),
然後,我們為頁面添加一些控制項來個人化頁面。
n 文字顏色:
<asp:DropDownList ID="ddl_TextColor" runat="server">
<asp:ListItem Selected="True">Black</asp:ListItem>
<asp:ListItem>Blue</asp:ListItem>
<asp:ListItem>Red</asp:ListItem>
</asp:DropDownList>
<asp:CheckBox ID="cb_IsBlod" runat="server" Text="粗體" />
<br />
<asp:Button ID="btn_SaveSettings" runat="server" Text="儲存個人化" OnClick=
"btn_SaveSettings_Click" />
<asp:Button ID="btn_Login" runat="server" OnClick="btn_
Login_Click" Text="登入" /><br />
<asp:Label ID="lab_Text" runat="server" Font-Names="黑
體" Font-Size="50pt" Height="77px" Text="編程快樂" Width=
"293px"></asp:Label>
效果12-24所示。
通過下拉框我們可以設定文字的顏色為黑色、藍色或者紅色,通過複選框我們可以設定文字是否是粗體。單擊“儲存個人化”按鈕儲存設定。
protected void btn_SaveSettings_Click(object sender, EventArgs e)
{
Profile.UI.ForeColor = ddl_TextColor.SelectedValue;
Profile.UI.EnableBold = cb_IsBlod.Checked;
ApplyUISettings();
}
看到這裡讀者會不會很驚訝,我們僅僅在Web.config檔案中配置了Profile的資訊,怎麼在代碼中就直接能訪問到強型別的Profile了呢?其實,系統會在App_Code下產生臨時的代碼檔案,12-25所示。
圖12-25 系統產生的臨時代碼檔案
在這裡我們又自訂了一個ApplyUISettings()方法來向頁面中的標籤應用樣式。
private void ApplyUISettings()
{
lab_Text.ForeColor = Color.FromName(Profile.UI.ForeColor);
lab_Text.Font.Bold = Profile.UI.EnableBold;
ddl_TextColor.SelectedValue = Profile.UI.ForeColor;
cb_IsBlod.Checked = Profile.UI.EnableBold;
}
同時為了保證頁面首次載入的時候也能按照使用者的個人化配置來顯示,我們在Page_Load()的時候也需要應用配置。
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
ApplyUISettings();
}
}
現在開啟頁面,並把樣式設定為藍色文字,粗體顯示,12-26所示。
首次操作的時候比較慢,因為系統正在為你產生儲存資訊的資料庫。預設是使用SQL Express資料庫,檔案就放在網站的App_Data檔案夾下,12-27所示。
圖12-26 儲存自己的個人化 圖12-27 App_Data下的ASPNETDB資料庫檔案
關閉頁面後再開啟,可以發現頁面仍然保持了原來的樣式設定。你可能會問,系統怎麼知道我們還是原來的那個使用者呢?其實,系統為匿名使用者產生了一個ID字串儲存於Cookie中,頁面載入的時候根據這個ID從資料庫中讀出資料填充Profile。在測試了匿名使用者的Profile後,我們來為登入按鈕添加Click事件處理方法。
protected void btn_Login_Click(object sender, EventArgs e)
{
FormsAuthentication.SetAuthCookie("test", false);
Response.Redirect(Request.Path);
}
在這裡,我們假設一個名為test的使用者登入了系統,並把頁面重新導向到本頁。然後,我們在頁面上添加一個PlaceHolder控制項,在其中放置一些控制項讓使用者輸入Profile的資訊和退出登入。
<asp:PlaceHolder ID="ph_UserInfo" runat="server">
姓名:<asp:TextBox ID="tb_Name" runat="server"></asp:TextBox>
年齡:<asp:TextBox ID="tb_Age" runat="server"></asp:TextBox>
<br />
<asp:Button ID="btn_SaveUserInfo" runat="server" Text="儲存使用者資訊" OnClick=
"btn_SaveUserInfo_Click" />
<asp:Button ID="btn_Logout" runat="server" OnClick="btn_Logout_Click" Text="退
出" />
</asp:PlaceHolder>
儲存使用者資訊按鈕Click事件實現如下:
protected void btn_SaveUserInfo_Click(object sender, EventArgs e)
{
Profile.UserInfo.UserName = tb_Name.Text;
Profile.UserInfo.UserAge = int.Parse(tb_Age.Text);
GetUserInfo();
}
這裡的GetUserInfo用於顯示使用者的資訊(登入使用者的資訊和非登入使用者的資訊)。
private void GetUserInfo()
{
if (User.Identity.IsAuthenticated)
{
ph_UserInfo.Visible = true;
Response.Write("當前登入使用者:" + User.Identity.Name + "<br/>");
Response.Write("Profile關聯使用者:" + Profile.UserName + "<br/>");
Response.Write("Profile.UserInfo.UserName:" + Profile.UserInfo.UserName +
"<br/>");
Response.Write("Profile.UserInfo.UserAge:" + Profile.UserInfo.UserAge +
"<br/>");
}
else
{
ph_UserInfo.Visible = false;
Response.Write("Profile關聯使用者:" + Profile.UserName + "<br/>");
}
}
退出登入按鈕Click事件實現如下:
protected void btn_Logout_Click(object sender, EventArgs e)
{
FormsAuthentication.SignOut();
Profile.UserInfo.UserAge = 0;
Profile.UserInfo.UserName = "";
Response.Redirect(Request.Path);
}
同時,我們修改一下Page_Load,讓頁面首次載入的時候也顯示使用者資訊。
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
ApplyUISettings();
GetUserInfo();
}
}
再次開啟頁面,12-28所示。
我們看到,對於匿名使用者來說,Profile.UserName屬性為一個隨機字串,單擊“登入”按鈕後12-29所示。
圖12-28 匿名使用者關聯了一個隨機字串作為ID 圖12-29 單擊登入按鈕後顯示使用者資訊
現在可以看到Profile關聯的使用者UserName已經為登入的test使用者了。現在,我們把姓名設定為“小朱”,年齡設定為24,單擊“儲存使用者資訊”按鈕。然後把樣式修改為紅色粗體,單擊“儲存個人化”按鈕。12-30所示。
n 如果你現在關閉視窗再重新開啟就會發現個人化還是原來在匿名狀態下儲存的藍色粗體。因此現在已經不在登入狀態了,比較一下發現現在的ID和上次的ID還是一樣的。再次單擊“登入”按鈕後,頁面又載入了test使用者的個人化。
7.2 Profile總結
Profile的知識遠遠不止這些,我們這裡僅僅對它進行了簡單的介紹,在結束以前我們以第一節中的幾個問題結束對Profile的討論。
· 儲存的物理位置。用戶端Cookie/URL和伺服器資料庫。
· 儲存的類型限制。可序列化類別型。
· 狀態使用的範圍。當前請求的上下文,對每一個使用者獨立。
· 儲存的大小限制。任意大小,讀取寫入頻繁的資料不建議存入Profile。
· 生命週期。與關聯的Cookie的生命週期一樣。
· 安全與效能。資料總是儲存在服務端,安全性比較高,但不易儲存過多資料。
· 優缺點與注意事項。可以很方便地儲存使用者(匿名使用者和已登入使用者)的設定。
本文來自CSDN部落格,轉載請標明出處:http://blog.csdn.net/ojekleen/archive/2007/10/23/1839430.aspx