作者: Stephen Walther
原文地址:http://msdn.microsoft.com/asp.net/default.aspx?pull=/library/en-us/dnvs05/html/UserProfiles.asp
译者:Tony Qu (来自BluePrint翻译团队)
概要:许多ASP.NET应用程序需要跨访问的用户属性跟踪功能,在ASP.NET1.1中,我们只能人工实现这一功能。但如今,使用 ASP.NET 2.0的Profile对象,这个过程变得异常简单。Stephen Walther将验证该对象,并向你展示如何使用Profile来跟踪用户属性、创建一个购物篮,及其他一些例子。
总目录
介绍
User Profile总揽
定义User Profile
使用Profile组
使用复杂的Profile属性
继承一个Profile
迁移匿名Profile设置
配置Profile Provider
管理Profiles并生成Profile报告
总结
相关书籍
Microsoft ASP.NET 2.0支持被称为Profile的新对象,它可以自动在多个Web应用程序的访问之间存储用户信息。一个User Profile中可以存储各种类型的信息,这些信息既可以是简单的string和integer类型,也可以是复杂的自定义类型。例如,你可以存储用户的姓、购物篮、用户属性或网站使用情况统计。
本文中,你将学习如何在一个应用中定义user profile。我们也会向你演示如何配置使用不同provider的profile。最后,你将学习如何管理和生成user profile的报告。
User Profiles总揽
Profile 对象与Session对象十分相似,但是更好用一些。与Session相似的地方在于,Profile是相对于一个特定的用户的,也就是说,每个Web应用程序的用户都有他们自己的profile对象。与Session不同的是,Profile对象是持久对象。如果你向Session中添加一个项,在你离开网站时,该项就会消失。而Profile则完全不同,当你修改Profile的状态时,修改在多个访问之间均有效。
profile使用provider模式来存储信息,默认情况下,user profile的内容会保存在SQL Server Express数据库中,该数据库位于网站的App_Data目录。然而,在本文的后半部分,你将了解如何使用其他数据提供者(data provider)来存储信息,如完整版的SQL Server中的一个数据库或者一个Oracle数据库。
与Session不同,Profile是强类型的,Session对象仅仅是一个项集合而已,而profile对象则有强类型属性。
使用强类型是有它的道理的。例如,使用强类型,你就可以在Microsoft Visual Web Developer中使用智能感知技术,当你键入Profile和一个点的时候,智能感知会弹出你已经定义过的profile属性列表。
定义user profile
你既可以在machine.config中,也可以在web.config中定义一个user profile,由于你不能在应用程序的二级目录中创建一个包含文件profile节的web.config文件,这意味着你将无法在一个应用程序中定义两个以上的profile。
在列表1的web.config中,列举了一个简单的profile定义的实例,该profile有三个属性,FirstName, LastName和PageVisits。
<!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>-->列表1
<configuration>
<system.web>
<authenticationmode="Forms"/>
<anonymousIdentificationenabled="true"/>
<profile>
<properties>
<add
name="FirstName"
defaultValue="??"
allowAnonymous="true"/>
<add
name="LastName"
defaultValue="??"
allowAnonymous="true"/>
<add
name="PageVisits"
type="Int32"
allowAnonymous="true"/>
</properties>
</profile>
</system.web>
</configuration>
由于该profile需要同时被匿名用户和已认证用户使用,因此我们在web.config文件中增加包含一个< anonymousIdentification>元素,有了这个元素,系统就会自动为匿名用户生成唯一的ID。仔细看的话我们会发现,每一个 profile属性都有一个allowAnonymous特性,该特性表明这个profile属性是否允许被匿名用户使用。
默认的profile属性类型是System.String类型。列表1中,由于没有为FirstName和LastName这两个profile属性增加type特性,那么系统默认它们是string类型,而PageVisits属性则指定了type特性为Int32,因此该profile属性可用于表示一个整型值。
最后,注意FirstName和LastName属性都有defaultValue特性。你可以为简单的数据类型设置defaultValue特性,但你不能为复杂类型设置defaultValue特性。
当你定义好一个profile之后,系统会自动在下一次页面被调用时,生成一个与该profile相对应的类。这个类会被保存在"Temporary ASP.NET Files Directory"目录(该目录也用于存放用于动态生成页面的类)。你可以使用HttpContext的Profile属性(Property)调用该类。
当你定义好一个profile后,你可以使用如下方法为profile属性赋值。
<!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>-->[VisualBasic.NET]
Profile.FirstName="Bill"
[C#]
Profile.FirstName="Bill";
任何在web.config中定义的profile属性都会在Profile对象中呈现。
列表2演示了你该如何使用profile来持久化保存用户信息。这个页显示了FirstName,LastName, PageVisits三个属性的值,同时它包含了一个能够用于修改这三个属性的表单(form)。在Page_Load中更新PageVisits的值,这意味着每一次刷新页面,PageVisits的值都会改变。
图1 使用简单的profile
<!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>-->列表 2. Simple.aspx (Visual Basic .NET)
<%@PageLanguage="VB"%>
<scriptrunat="server">
SubPage_Load()
Profile.PageVisits+=1
EndSub
SubUpdateProfile(ByValsAsObject,ByValeAsEventArgs)
Profile.FirstName=txtFirstName.Text
Profile.LastName=txtLastName.Text
EndSub
</script>
<html>
<head>
<title>Simple</title>
</head>
<body>
<formid="form1"runat="server">
<b>Name:</b><%=Profile.FirstName%><%=Profile.LastName%>
<br/>
<b>PageVisits:</b><%=Profile.PageVisits%>
<hr/>
<b>FirstName:</b>
<asp:TextBoxID="txtFirstName"Runat="Server"/>
<br/>
<b>LastName:</b>
<asp:TextBoxID="txtLastName"Runat="Server"/>
<br/>
<asp:Button
Text="UpdateProfile"
OnClick="UpdateProfile"
Runat="server"/>
</form>
</body>
</html>
列表 2. Simple.aspx (C#)
<%@PageLanguage="C#"%>
<scriptrunat="server">
voidPage_Load(){
Profile.PageVisits++;
}
voidUpdateProfile(Objects,EventArgse){
Profile.FirstName=txtFirstName.Text;
Profile.LastName=txtLastName.Text;
}
</script>
<html>
<head>
<title>Simple</title>
</head>
<body>
<formid="form1"runat="server">
<b>Name:</b><%=Profile.FirstName%><%=Profile.LastName%>
<br/>
<b>PageVisits:</b><%=Profile.PageVisits%>
<hr/>
<b>FirstName:</b>
<asp:TextBoxID="txtFirstName"Runat="Server"/>
<br/>
<b>LastName:</b>
<asp:TextBoxID="txtLastName"Runat="Server"/>
<br/>
<asp:ButtonID="Button1"
Text="UpdateProfile"
OnClick="UpdateProfile"
Runat="server"/>
</form>
</body>
</html>
如果你多次访问列表2中的页面,你会注意到PageVisits在不断增大。如果你关闭的浏览器,并在一周之后调用该页面,PageVisits属性仍然会保留原值。从这一点可以看出Profile为每个用户自动保存一个副本。
使用Profile组
尽管你仅可以为一个应用程序定义一个profile,但如果你需要让几个profile属性一起工作,把它们放在组中,会让你觉得它们更易管理。
例如,在列表3中,有一个带有两个组的profile,这两个组分别是Address和Preferences
<!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>-->列表3. Web.Config
<configuration>
<system.web>
<anonymousIdentificationenabled="true"/>
<profile>
<properties>
<groupname="Address">
<add
name="Street"
allowAnonymous="true"/>
<add
name="City"
allowAnonymous="true"/>
</group>
<groupname="Preferences">
<add
name="ReceiveNewsletter"
type="Boolean"
defaultValue="false"
allowAnonymous="true"/>
</group>
</properties>
</profile>
</system.web>
</configuration>
当你用组来定义profile时,你应该使用组名来设置或读取profile属性。例如,在列表3中,你可以使用以下一些句子来完成三个profile属性的赋值。
<!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>-->[VisualBasic.NET]
Profile.Address.City="Modesto"
Profile.Address.Street="111KingArthurLn"
Profile.Preferences.ReceiveNewsletter=False
[C#]
Profile.Address.City="Modesto";
Profile.Address.Street="111KingArthurLn";
Profile.Preferences.ReceiveNewsletter=false;
一个profile的定义只能包含一层组,换句话说,你不能把其他的组放在一个profile组的下面一层。
使用复杂的profile属性
到目前为止,我们已经介绍了声明包含简单类型(如string或整型)属性的profile,其实你也可以在profile中声明复杂属性。
举个例子,假设你现在需要在profile中存储一个购物篮,如果这样做的话,你就可以在每次访问网站时获得自己的购物篮。
列表4 声明了一个包含profile,这个profile包含一个名为ShoppingCart的属性,而该属性的type特性是一个叫ShoppingCart的类(我们接下来会创建该类),该类名是有效的。
我们还会注意到,该声明中包含一个serializeAs特性,该特性可以帮助ShoppingCart使用二进制序列化器(binary serializer)进行持久化,而不是使用xml序列化器。
<!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>-->列表4 Web.config
<configuration>
<system.web>
<anonymousIdentificationenabled="true"/>
<profile>
<properties>
<add
name="ShoppingCart"
type="ShoppingCart"
serializeAs="Binary"
allowAnonymous="true"/>
</properties>
</profile>
</system.web>
</configuration>
列表5 中有一个简单购物篮的实现代码,该购物篮拥有添加和删除项(item)的方法(method),同时它还拥有两个属性(property),一个是用于获得该购物篮中的所有项的,一个是用于表示所有商品的总价的。
<!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>-->列表5 ShoppingCart (Visual Basic.NET)
ImportsMicrosoft.VisualBasic
<Serializable()>_
PublicClassShoppingCart
Public_CartItemsAsNewHashtable()
'ReturnalltheitemsfromtheShoppingCart
PublicReadOnlyPropertyCartItems()AsICollection
Get
Return_CartItems.Values
EndGet
EndProperty
'Thesumtotaloftheprices
PublicReadOnlyPropertyTotal()AsDecimal
Get
DimsumAsDecimal
ForEachitemAsCartItemIn_CartItems.Values
sum+=item.Price*item.Quantity
Next
Returnsum
EndGet
EndProperty
'Addanewitemtotheshoppingcart
PublicSubAddItem(ByValIDAsInteger,_
ByValNameAsString,ByValPriceAsDecimal)
DimitemAsCartItem=CType(_CartItems(ID),CartItem)
IfitemIsNothingThen
_CartItems.Add(ID,NewCartItem(ID,Name,Price))
Else
item.Quantity+=1
_CartItems(ID)=item
EndIf
EndSub
'Removeanitemfromtheshoppingcart
PublicSubRemoveItem(ByValIDAsInteger)
DimitemAsCartItem=CType(_CartItems(ID),CartItem)
IfitemIsNothingThen
Return
EndIf
item.Quantity-=1
Ifitem.Quantity=0Then
_CartItems.Remove(ID)
Else
_CartItems(ID)=item
EndIf
EndSub
EndClass
<Serializable()>_
PublicClassCartItem
Private_IDAsInteger
Private_NameAsString
Private_PriceAsDecimal
Private_QuantityAsInteger=1
PublicReadOnlyPropertyID()AsInteger
Get
Return_ID
EndGet
EndProperty
PublicReadOnlyPropertyName()AsString
Get
Return_Name
EndGet
EndProperty
PublicReadOnlyPropertyPrice()AsDecimal
Get
Return_Price
EndGet
EndProperty
PublicPropertyQuantity()AsInteger
Get
Return_Quantity
EndGet
Set(ByValvalueAsInteger)
_Quantity=value
EndSet
EndProperty
PublicSubNew(ByValIDAsInteger,_
ByValNameAsString,ByValPriceAsDecimal)
_ID=ID
_Name=Name
_Price=Price
EndSub
EndClass
<!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>-->
列表5 ShoppingCart (c#)
usingSystem;
usingSystem.Collections;
[Serializable]
publicclassShoppingCart
{
publicHashtable_CartItems=newHashtable();
//ReturnalltheitemsfromtheShoppingCart
publicICollectionCartItems
{
get{return_CartItems.Values;}
}
//Thesumtotaloftheprices
publicdecimalTotal
{
get
{
decimalsum=0;
foreach(CartItemitemin_CartItems.Values)
sum+=item.Price*item.Quantity;
returnsum;
}
}
//Addanewitemtotheshoppingcart
publicvoidAddItem(intID,stringName,decimalPrice)
{
CartItemitem=(CartItem)_CartItems[ID];
if(item==null)
_CartItems.Add(ID,newCartItem(ID,Name,Price));
else
{
item.Quantity++;
_CartItems[ID]=item;
}
}
//Removeanitemfromtheshoppingcart
publicvoidRemoveItem(intID)
{
CartItemitem=(CartItem)_CartItems[ID];
if(item==null)
return;
item.Quantity--;
if(item.Quantity==0)
_CartItems.Remove(ID);
else
_CartItems[ID]=item;
}
}
[Serializable]
publicclassCartItem
{
privateint_ID;
privatestring_Name;
privatedecimal_Price;
privateint_Quantity=1;
publicintID
{
get{return_ID;}
}
publicstringName
{
get{return_Name;}
}
publicdecimalPrice
{
get{return_Price;}
}
publicintQuantity
{
get{return_Quantity;}
set{_Quantity=value;}
}
publicCartItem(intID,stringName,decimalPrice)
{
_ID
分享到:
相关推荐
许多ASP.NET应用程序需要跨访问的用户...但如今,使用 ASP.NET 2.0的Profile对象,这个过程变得异常简单。Stephen Walther将验证该对象,并向你展示如何使用Profile来跟踪用户属性、创建一个购物篮,及其他一些例子。
《ASP.NET 2.0 入门经典》将逐步引导您使用 ASP.NET 2.0 创建动态的、数据驱动的、复杂的Web站点。在本章结束时,我们将解释一些基本的想法并介绍一个完整的示例站点。然后将学习怎样使用 Visual Web Developer ...
熟悉ASP.NET 1.x的程序员亟需快速掌握ASP.NET 2.0新增的功能和控件,以便立刻使用ASP.NET 2.0来编写程序。 本书通过深入剖析12个使用ASP.NET 2.0开发的项目,全面阐述了ASP.NET 2.0应用程序的架构及ASP.NET 2.0...
在全面介绍ASP.NET各种编程技能的同时重点介绍了ASP.NET 2.0版本中的巨大变化,详细阐述了ASP.NET 2.0中所包含的每个新特性。书中提供了大量的实例,可帮助读者快速掌握如何在.NET Framework下构建功能强大的ASP.NET...
内容代码,使用VB.net和C# 两种解释 <br>第1章ASP.NET2.0概述 1 1.1简史 1 1.2ASP.NET2.0的目标 2 1.2.1开发人员的效率 3 1.2.2管理 5 1.2.3性能和可伸缩性 8 1.3ASP.NET2.0的其他新特性 8 ...
《ASP.NET 2.0 入门经典》将逐步引导您使用 ASP.NET 2.0 创建动态的、数据驱动的、复杂的Web站点。在本章结束时,我们将解释一些基本的想法并介绍一个完整的示例站点。然后将学习怎样使用 Visual Web Developer ...
原装的英文版Asp.net2.0 入门经典C#篇.避免了翻译后的质量下降
ASP.NET 2.0动态网站开发基础教程(C#) 第01章 ASP.NET2.0基础 Framework Web Form(共32页).ppt ASP.NET 2.0动态网站开发基础教程(C#) 第02章 HTML和脚本语言 VBScript javaScript(共21页).ppt ASP.NET 2.0...
本卷从最易于理解和使用的那部分入手,介绍ASP.NET AJAX框架中能够与传统ASP.NET无缝对接的服务器端部分,包括服务器端ASP.NET AJAX Extensions与ASP.NET AJAX Control Toolkit。这部分内容不需要读者有任何的客户端...
本书以全新ASP.NET 2.0内容设计为出发点,循序渐进地以图文步骤及观念讲解新的ASP.NET 2.0技术精要。内容涵盖VS 2005开发工具、SQL Server 2005安装管理策略与ASP.NET 2.0各种新功能,乃至于极度爆红的AJAX与Atlas ...
asp.net 2.0 网站开发全程解析 第2版
本书以全新ASP.NET 2.0内容设计为出发点,循序渐进地以图文步骤及观念讲解新的ASP.NET 2.0技术精要。内容涵盖VS 2005开发工具、SQL Server 2005安装管理策略与ASP.NET 2.0各种新功能,乃至于极度爆红的AJAX与Atlas ...
本书以全新ASP.NET 2.0内容设计为出发点,循序渐进地以图文步骤及观念讲解新的ASP.NET 2.0技术精要。内容涵盖VS 2005开发工具、SQL Server 2005安装管理策略与ASP.NET 2.0各种新功能,乃至于极度爆红的AJAX与Atlas ...
本书以全新ASP.NET 2.0内容设计为出发点,循序渐进地以图文步骤及观念讲解新的ASP.NET 2.0技术精要。内容涵盖VS 2005开发工具、SQL Server 2005安装管理策略与ASP.NET 2.0各种新功能,乃至于极度爆红的AJAX与Atlas ...
本书以全新ASP.NET 2.0内容设计为出发点,循序渐进地以图文步骤及观念讲解新的ASP.NET 2.0技术精要。内容涵盖VS 2005开发工具、SQL Server 2005安装管理策略与ASP.NET 2.0各种新功能,乃至于极度爆红的AJAX与Atlas ...
ASP.NET 2.0网络开发技术 ASP.NET 2.0类,对象和命名空间,电子书
ASP.net 2.0网络编程从入门到精通-修订.rar
ASP.NET 2.0快速入门(3):ASP.NET 2.0的新控件
接下来介绍了.NET中Web页面设计的基础知识和ASP.NET2.0服务器端控件的使用方法;作为ASP.NET数据库开发的准备内容,本书也介绍了些SQL语言的基础知识。此外,还介绍了ASP.NET中的常用对象、数据访问技术、数据源控件...
ASP.NET 2.0快速入门(5):ASP.NET 2.0 缓存技术