既然由登錄控件涉及到了Membership,那么就不得不提到用戶個性化PRofile對象。個性化允許為用戶保存特定的個性化信息到數據庫中,因此它不同于asp.net狀態管理之處在于可以永久性保存這些信息,很有必要強調一下web application與website的一個不同,web application中無法象website中那樣,直接用Profile對象(http://hi.baidu.com/windlhj/blog/item/8f4c4a13779de02fdc5401b7.html,web application和website相互轉化http://blog.csdn.net/guwenzhong/archive/2009/11/10/4792814.aspx)。個性化的設置與Membership的設置非常類似:
1.配置個性化提供者
默認個性化提供者是SqlProfileProvider,它使用ASP.NET.MDF(怎么樣是不是非常熟悉,忘記的話去看Membership的設置)存儲個性化信息。實際上你按照Membership的設置創建好數據存儲,也就把個性化的數據存儲創建好了,因為Membership與Profile用的是一個數據庫(包括利用aspnet_regsql.exe更換數據庫以后),用戶的個性信息保存在數據庫的aspnet_profile表中。與Membership一樣Profile的個性提供者也是在根web.config里配置的。因為之前已經配置好了數據庫連接節點,所以這里只配個性化提供者就行了:
<system.web>
<profile defaultProvider="MyFirstSqlProfileProvider">
<providers>
<clear/>
<add name="MyFirstSqlProfileProvider" type="System.Web.Profile.SqlProfileProvider"
connectionStringName="newsystemConnectionString" applicationName="ProfileDemo"/>
</providers>
</profile>
</system.web>
這樣就配置好了個性化提供者,其名字是MyFirstSqlProfileProvider。
而我們既然要存儲用戶的個性化信息到aspnet_profile表中,我們必須為其添加屬性,而這些屬性要在<profile>節點內的<properties>里用<add>標簽添加,并且至少要有一個屬性名:
<system.web>
<profile defaultProvider="MyFirstSqlProfileProvider">
<providers>
<clear/>
<add name="MyFirstSqlProfileProvider" type="System.Web.Profile.SqlProfileProvider"
connectionStringName="newsystemConnectionString" applicationName="ProfileDemo"/>
</providers>
<properties>
<add name="QQ" type="string"/>
<add name="Age" type="Int32"/>
<add name="Address" type="string"/>
<add name="Tel" type="string"/>
</properties>
</profile>
</system.web>
profile屬性的意思:name(屬性名,必須)type(屬性類型,默認是string)serializeAs(當序列化時使用的格式)
readOnly(只讀屬性)defaultValue(屬性的默認值)allowAnonymous(布爾值,是否允許匿名用戶讀取和設置該屬性)
Provider(該屬性關聯的個性化提供者)customProviderData(允許用戶傳遞自定義數據到個性化提供者)
使用個性化屬性
在默認情況下只有驗證用戶才能讀取和寫入個性化信息到數據庫,舉例如下:
//直接給profile賦值就可保存用戶個性化,很類似session
protected void Button1_Click(object sender, EventArgs e)
{
//在webapp中無法像website中那樣直接使用profile對象,引入using System.Web.Profile還是無法直接用,但可以使用ProfileBase,ProfileManager,ProfileMigrateEventArgs等類。
//存儲個性化信息
HttpContext.Current.Profile.SetPropertyValue("QQ", TextBox9.Text);
HttpContext.Current.Profile.SetPropertyValue("Age", int.Parse(DropDownList2.SelectedValue));
HttpContext.Current.Profile.SetPropertyValue("Tel", TextBox10.Text);
HttpContext.Current.Profile.SetPropertyValue("Address",TextBox11.Text);
}
protected void Button2_Click(object sender, EventArgs e)
{
//獲取個性化信息
Label1.Text = "當前用戶:" + HttpContext.Current.Profile.UserName + "QQ:" + HttpContext.Current.Profile.GetPropertyValue("QQ") + "Age:" + HttpContext.Current.Profile.GetPropertyValue("Age") + "Tel" + HttpContext.Current.Profile.GetPropertyValue("Tel") + "Address" + HttpContext.Current.Profile.GetPropertyValue("Address");
}
還可以給個性化屬性分組便于管理:在web.config中<properties>節點內加<group>再添加組名跟屬性即可:
<system.web>
<profile defaultProvider="MyFirstSqlProfileProvider">
<providers>
<clear/>
<add name="MyFirstSqlProfileProvider" type="System.Web.Profile.SqlProfileProvider"
connectionStringName="newsystemConnectionString" applicationName="ProfileDemo"/>
</providers>
<properties>
<add name="QQ" type="string"/>
<add name="Age" type="Int32"/>
<add name="Address" type="string"/>
<add name="Tel" type="string"/>
<group name="Habits">
<add name="likebooks"/>
<add name="likesports"/>
</group>
</properties>
</profile>
</system.web>
那些屬性的type類型也可以是自己寫的類(該類既可以在App_Code里(App_Code相當于當前命名空間里的子命名空間(在webapp里使用注意其里面類的屬性要改成編譯才能被智能提示))也可以在已編譯好的DLL里(DLL是程序集的一種形式(另一種是exe)但在Web.config里一定要寫全類所在的命名空間.類名,否則會出現找不到類型的錯誤):
如 <add name="ZiDingDe" type="Dingyibymyself.personlity"/> 屬性名ZiDingDe 類型 寫全類所在的命名空間.類名 Dingyibymyself.personlity
再如在App_Code里的自定義類 <add name="ZiDingDe2" type="WebApplication1.App_Code.personlity"/> 是不是就是子命名空間?
新聞熱點
疑難解答