亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

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

系統 2131 0

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

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


導言:

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

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

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

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

概述Profile System

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

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

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


定義用戶屬性

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


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

.String—屬性值將轉換成一個字符串形式

.Xml—屬性值將轉換成一個XML形式

.Binary—屬性值將轉換成一個二進制形式

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


定義在Profile system的屬性可為簡單的標量類型(scalar),進而在聚合(grouped into)成復雜的類型,或已存在的復雜類型(例如一個類)。每個Profile屬性的names, types,和serialization都定義在<profile> 元素的<properties>節點.比如,假象我們要用戶指定一個主頁的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>元素添加額外的屬性.

標量類型的屬性可以通過使用<group>元素進行聚合。比如,除了HomepageUrl屬性外,我們還想獲取用戶的實際位置、生日、選用的編程語言等.這些信息可以分別為3個標量值,也可以進行聚合.如下的代碼顯示如何將這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文件夾里創建的。代碼如下:

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

此外,Profile屬性的類型還可以為一個自定義類,在本文下載內容里,你將發現一個很簡單的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引擎自動地創建一個ProfileCommon class類,該類包含的屬性與我們在Web.config文件里定義的屬性相匹配.當我們在Web.config文件里修改這些屬性后,該類將重新創建并自動處理當前登錄用戶的profile.(你也可以設置profile對匿名用戶的支持,不過這不是本文的主題,我們將在后面的文章探討).

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

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

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

指定一個Profile Provider

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

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


對于給定的記錄,PropertyNames列包含的是每個Profile屬性的名稱,根據其序列化形式的不同,將其值存儲在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的值已經被序列化為XML形式,開始位置為0,長度為92;同樣,HomepageUrl屬性開始位置為92,長度為30.(而ShippingAddress屬性為Binary形式,我們可以在PropertyValuesBinary列里找到其值,開始位置為0.長度為212)

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


SqlProfileProvider的局限性

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

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

結語:

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

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

祝編程快樂!

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


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

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

【本文對您有幫助就好】

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

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 激情五月婷婷在线 | 一及黄色毛片 | 国产99精品免费视频看6 | 在线久| 精精国产www视频在线观看免费 | 久久国产精品99久久久久久老狼 | 国产精品网站 夜色 | 美女一级大黄录像一片 | 波多野结衣一区二区 | 日韩在线一区二区 | 久久se精品动漫一区二区三区 | 久久久久国产精品免费免费不卡 | 看黄a大片 免费 | 欧美亚洲另类久久综合 | 四只虎免费永久观看地址 | 男人的天堂一区二区视频在线观看 | 91在线品视觉盛宴免费 | 欧美精品二区 | 成人短视频视频在线观看网站 | 免费视频久久 | 中文字幕在线视频精品 | 中文国产日韩欧美视频 | 日本毛片在线 | 日本视频不卡 | 国产成人精品亚洲日本在线 | 日日操夜夜操天天操 | 99精品久久99久久久久久 | 欧美操片 | 久操小视频 | 亚洲精品一区二区三区在 | 免费深夜福利 | 男人的天堂a在线 | 欧美一区二区三区在观看 | 女人18毛片a级毛片免费看一 | 欧美精欧美乱码一二三四区 | 亚洲视频福利 | 99精品欧美一区 | 久久精品视频一区二区三区 | 99re热这里只有精品视频 | 青青免费视频精品一区二区 | 国产综合色在线视频区 |