日韩久久久精品,亚洲精品久久久久久久久久久,亚洲欧美一区二区三区国产精品 ,一区二区福利

考察ASP.NET 2.0的Membership, Roles,Profile -

系統(tǒng) 2323 0

本文英文原版及代碼下載:
http://aspnet.4guysfromrolla.com/articles/101106-1.aspx

考察ASP.NET 2.0的Membership, Roles,Profile - Part 6


導(dǎo)言:

除了用戶帳戶的username, passsword, email, security question和 answer等,在實際的程序中我們還可能添加額外的信息,比如我們可能需要用戶指定一個簽名、主頁URL、以及IM address等.

使用Membership model,有2種方法來將用戶帳戶與額外的信息聯(lián)系起來.第一種,具有最大的靈活性也要做最多的準(zhǔn)備工作——為額外信息創(chuàng)建自定義數(shù)據(jù)存儲.如果你使用的是SqlMembershipProvider,那就意味著要創(chuàng)建一個額外的表,將aspnet_Users表的UserId值作為主鍵.以一個在線messageboard為例,該表可為forums_UserProfile,具有的列為UserId(將aspnet_Users表的UserId作為主鍵和外鍵)、HomepageUrl、 Signature、 IMAddress.

另外,我們還可以使用ASP.NET 2.0 Profile system來存儲用戶的具體信息.Profile system允許定義與用戶相關(guān)的屬性。一旦定義后,開發(fā)者就可以通過編程來讀取和訪問這些屬性的值.與Membership、Roles類似,Profile system也是基于provider model,默認(rèn)情況下,.NET Framework有一個SqlProfileProvider class類,它使用一個SQL Server數(shù)據(jù)庫表(aspnet_Profile)來作為其存儲備份(backing store).

在本文,我們將考察Profile system——如何定義用戶屬性以及如何從ASP.NET頁面來編程訪問它們。同時我們還將看到.NET 2.0里的SqlProfileProvide使用自定義的profile provider。

概述Profile System

ASP.NET 2.0里面的Membership system設(shè)計來創(chuàng)建處理用戶帳戶的標(biāo)準(zhǔn)API.雖然Membership system有與用戶相關(guān)的核心屬性—username, password, email address等,但是我們還經(jīng)常需要獲取每個用戶的其它信息.而且每個程序之間的額外信息還彼此不同.

為此,微軟創(chuàng)建Profile system來處理這些額外的用戶屬性.Profile system允許將這些用戶屬性定義在Web.config文件并將其值存儲在某些數(shù)據(jù)存儲里.默認(rèn)的Profile provider - SqlProfileProvider,將這些屬性值存儲在一個叫aspnet_Profile的SQL Server數(shù)據(jù)庫表里.

當(dāng)使用Profile system時,我們要記住其唯一的目的是作為一種定義一系列用戶屬性的方法.再通過某個具體的provider,將這些屬性值存儲在某些backing store里.


定義用戶屬性

用Profile system,我們必須要在Web.config文件里定義清楚.對每個屬性我們要指定其name, 數(shù)據(jù)類型,以及數(shù)據(jù)應(yīng)如何序列化(serialized).如下為4個serialization選項:


.ProviderSpecific(默認(rèn))—Profile provider要決定如何序列化屬性值.

.String—屬性值將轉(zhuǎn)換成一個字符串形式

.Xml—屬性值將轉(zhuǎn)換成一個XML形式

.Binary—屬性值將轉(zhuǎn)換成一個二進制形式

你選擇哪種serialization方法取決于變量的類型.如果允許將屬性值轉(zhuǎn)化為一個String,那么我們就要讓provider將數(shù)據(jù)序列化為一個String;對XML和Binary類型,以此類推.


定義在Profile system的屬性可為簡單的標(biāo)量類型(scalar),進而在聚合(grouped into)成復(fù)雜的類型,或已存在的復(fù)雜類型(例如一個類)。每個Profile屬性的names, types,和serialization都定義在<profile> 元素的<properties>節(jié)點.比如,假象我們要用戶指定一個主頁的URL,我們可以添加如下的屬性:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
<system.web>
...

<profile defaultProvider="CustomProfileProvider" enabled="true">
<providers>
...
</providers>

<!-- Define the properties for Profile... -->
<properties>
<add name="HomepageUrl" type="String" serializeAs="String" />

...
</properties>
</profile>
</system.web>
</configuration>

<add>元素添加了一個名為HomepageUrl,類型為String,serialized為String的屬性。除此之外我們還可以在<add>元素添加額外的屬性.

標(biāo)量類型的屬性可以通過使用<group>元素進行聚合。比如,除了HomepageUrl屬性外,我們還想獲取用戶的實際位置、生日、選用的編程語言等.這些信息可以分別為3個標(biāo)量值,也可以進行聚合.如下的代碼顯示如何將這3個屬性值聚合為一個名為Bio的組.

<profile defaultProvider="CustomProfileProvider" enabled="true">
<providers>
...
</providers>

<!-- Define the properties for Profile... -->
<properties>
<add name="HomepageUrl" type="String" serializeAs="String" />

<group name="Bio">
<add name="BirthDate" type="DateTime" serializeAs="Xml" />
<add name="Location" type="String" />
<add name="ProgrammingLanguageOfChoice" type="ProgrammingLanguages" />
</group>

...
</properties>
</profile>

上述代碼里,BirthDate屬性(類型為DateTime)被選作序列化為XML,而Location 和 ProgrammingLanguageOfChoice屬性未指定serializeAs屬性,那意味著Profile provider將自行決定如何序列化這2個屬性.注意ProgrammingLanguageOfChoice屬性的類型,該類型是我們在App_Code文件夾里創(chuàng)建的。代碼如下:

Public Enum ProgrammingLanguages As Integer
NoneSelected = 0
VB = 1
CSharp = 2
JSharp = 3
End Enum

此外,Profile屬性的類型還可以為一個自定義類,在本文下載內(nèi)容里,你將發(fā)現(xiàn)一個很簡單的Address class類(也是在App_Code文件夾):

<Serializable()> _
Public Class Address
Public Address1 As String
Public Address2 As String
Public City As String
Public State As String
Public Zip As Integer
End Class

定義了上述類后,我們可以添加一個Address類型的屬性,如下:

<profile defaultProvider="CustomProfileProvider" enabled="true">
<providers>
...
</providers>

<!-- Define the properties for Profile... -->
<properties>
<add name="HomepageUrl" type="String" serializeAs="String" />

<group name="Bio">
<add name="BirthDate" type="DateTime" serializeAs="Xml" />
<add name="Location" type="String" />
<add name="ProgrammingLanguageOfChoice" type="ProgrammingLanguages" />
</group>

<add name="BillingAddress" type="Address" serializeAs="Xml" />
<add name="ShippingAddress" type="Address" serializeAs="String" />
</properties>
</profile>

上述代碼里,BillingAddress 和 ShippingAddress屬性都為Address類型.


在代碼里處理Profile屬性

完成Profile屬性的定義后,ASP.NET引擎自動地創(chuàng)建一個ProfileCommon class類,該類包含的屬性與我們在Web.config文件里定義的屬性相匹配.當(dāng)我們在Web.config文件里修改這些屬性后,該類將重新創(chuàng)建并自動處理當(dāng)前登錄用戶的profile.(你也可以設(shè)置profile對匿名用戶的支持,不過這不是本文的主題,我們將在后面的文章探討).

可以在一個ASP.NET頁面里通過HttpContext對象的Profile屬性來訪問ProfileCommon class類。比如,要在一個ASP.NET頁面里讀取當(dāng)前登錄用戶的HomepageUrl屬性,僅僅只需要使用Profile.HomepageUrl即可. 實際上,只要你輸入Profile再鍵入一個“.”智能感知功能將帶出各種屬性。酷嗎?實際上聚合功能同樣工作地很好,輸入Profile再鍵入一個“.”,你將看到其中一個屬性為Bio.輸入Bio再鍵入一個“.”,那3個標(biāo)量屬性就出現(xiàn)在智能感知界面里(BirthDate, Location, and ProgrammingLanguageOfChoice).

考察ASP.NET 2.0的Membership, Roles,Profile - Part 6
圖1

本文下載代碼里有3個頁面值得考察,第一個頁面為/UsersOnly/Default.aspx頁面,顯示了當(dāng)前登錄用戶的Profile信息.第二個頁面為/UsersOnly/UpdateProfile.aspx,允許用戶更改其Profile數(shù)據(jù).第三個頁面演示了如何使用Profile屬性的GetProfile("username")方法來獲取其它,非當(dāng)前登錄用戶的Profile數(shù)據(jù).頁面/UserList.aspx列出了系統(tǒng)里的所有用戶的membership信息(username, email等),以及HomepageUrl屬性值.

指定一個Profile Provider

如果你沒有顯式地指定一個Profile provider,那么默認(rèn)使用的是SqlProfileProvider,它將用戶的property值存儲在aspnet_Profile表里,但效率比較低,該表的構(gòu)架如下:

考察ASP.NET 2.0的Membership, Roles,Profile - Part 6
圖2


對于給定的記錄,PropertyNames列包含的是每個Profile屬性的名稱,根據(jù)其序列化形式的不同,將其值存儲在PropertyValuesString 或 PropertyValuesBinary列.如果是以String或 XML形式則存儲在PropertyValuesString列;如果是以Binary形式則在PropertyValuesBinary列.

就我們定義的Profile屬性而言,該某個用戶的PropertyNames列的值可能為:

Bio.ProgrammingLanguageOfChoice:S:0:92:HomepageUrl:S:92:30:ShippingAddress:B:0:212:...

如你所見,每個property name的形式為PropertyName:B|S:StartIndex:Length,其中B 或 S指出了該屬性的值是存儲在PropertyValuesString(S)列 還是在 PropertyValuesBinary(B)列的.比如,Bio.ProgrammingLanguageOfChoice屬性的值存儲在PropertyValuesString (S)列,起始位置為0,長度為92.而HomepageUrl屬性的值也存儲在PropertyValuesString (S)列,起始位置為92,長度為30.

查看PropertyValuesString列,我們看到:

<?xml version="1.0" encoding="utf-16"?><ProgrammingLanguages>CSharp</ProgrammingLanguages>http://www.datawebcontrols.com...


ProgrammingLanguageOfChoice的值已經(jīng)被序列化為XML形式,開始位置為0,長度為92;同樣,HomepageUrl屬性開始位置為92,長度為30.(而ShippingAddress屬性為Binary形式,我們可以在PropertyValuesBinary列里找到其值,開始位置為0.長度為212)

SqlProfileProvider自動的將Profile屬性遷移到數(shù)據(jù)庫.而SqlProfileProvider用到的表和存儲過程是在貫徹SqlMembershipProvider時自動創(chuàng)建的(見Part 1).


SqlProfileProvider的局限性

由于SqlProfileProvider將所有的屬性值壓縮到一行的1到2列,每次對任何一個屬性值的讀取都要觸動所有的屬性值;另外數(shù)據(jù)的格式也使的我們很難查詢和返回這些屬性信息。假如我們想知道有多少用戶使用C#(該信息存儲在PropertyValuesString列),我們首先需要將其數(shù)據(jù)格式轉(zhuǎn)換成正常的數(shù)據(jù)結(jié)構(gòu).

作為SqlProfileProvider的替代,我們可以使用微軟雇員Hao Kung開發(fā)的免費的Table Profile Provider( http://www.asp.net/downloads/sandbox/table-profile-provider-samples/ )。該provider將每個Profile屬性存儲在各自的列里。另外,我們開可以創(chuàng)建自己的Profile provider.

結(jié)語:

除了username, password, email address這些基本的用戶信息外,如果你還想獲取更多的用戶信息,你要么使用自定義的解決方案(創(chuàng)建你自己的數(shù)據(jù)存儲,寫代碼來對數(shù)據(jù)存儲進行數(shù)據(jù)讀寫),要么使用Profile system. 它允許頁面開發(fā)者在Web.config文件里定義一系列的用戶屬性,這些信息自動的轉(zhuǎn)換為一個類(ProfileCommon),并可以通過HttpContext class類的Profile屬性來進行訪問.

ASP.NET 2.0默認(rèn)的Profile provider為SqlProfileProvider,它將Profile屬性值存儲在一個SQL Server數(shù)據(jù)庫的aspnet_Profile表里.我們只需要通過Profile屬性來讀寫用戶的Profile數(shù)據(jù).

祝編程快樂!

考察ASP.NET 2.0的Membership, Roles,Profile - Part 6


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯(lián)系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發(fā)表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 台江县| 青阳县| 宜州市| 莱阳市| 南和县| 溧阳市| 沐川县| 织金县| 凤冈县| 花垣县| 盘锦市| 屏东县| 洪雅县| 克山县| 绿春县| 宜章县| 芮城县| 泸州市| 芜湖县| 岗巴县| 凉城县| 咸阳市| 托克托县| 孟州市| 东丽区| 阜阳市| 昭平县| 西安市| 明星| 沭阳县| 济宁市| 县级市| 琼中| 兴城市| 汝州市| 华容县| 昔阳县| 大埔区| 聂拉木县| 南丰县| 七台河市|