在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
作者: Stephen Walther 概要:许多ASP.NET应用程序需要跨访问的用户属性跟踪功能,在ASP.NET1.1中,我们只能人工实现这一功能。但如今,使用 ASP.NET 2.0的Profile对象,这个过程变得异常简单。Stephen Walther将验证该对象,并向你展示如何使用Profile来跟踪用户属性、创建一个购物篮,及其他一些例子。 总目录 Microsoft ASP.NET 2.0支持被称为Profile的新对象,它可以自动在多个Web应用程序的访问之间存储用户信息。一个User Profile中可以存储各种类型的信息,这些信息既可以是简单的string和integer类型,也可以是复杂的自定义类型。例如,你可以存储用户的姓、购物篮、用户属性或网站使用情况统计。 User Profiles总揽 profile使用provider模式来存储信息,默认情况下,user profile的内容会保存在SQL Server Express数据库中,该数据库位于网站的App_Data目录。然而,在本文的后半部分,你将了解如何使用其他数据提供者(data provider)来存储信息,如完整版的SQL Server中的一个数据库或者一个Oracle数据库。 与Session不同,Profile是强类型的,Session对象仅仅是一个项集合而已,而profile对象则有强类型属性。 定义user profile
列表1
<configuration> <system.web> <authentication mode="Forms" /> <anonymousIdentification enabled="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属性类型是System.String类型。列表1中,由于没有为FirstName和LastName这两个profile属性增加type特性,那么系统默认它们是string类型,而PageVisits属性则指定了type特性为Int32,因此该profile属性可用于表示一个整型值。 最后,注意FirstName和LastName属性都有defaultValue特性。你可以为简单的数据类型设置defaultValue特性,但你不能为复杂类型设置defaultValue特性。
[Visual Basic .NET]
Profile.FirstName = "Bill" [C#] Profile.FirstName = "Bill";
任何在web.config中定义的profile属性都会在Profile对象中呈现。
图1 使用简单的profile
列表 2. Simple.aspx (Visual Basic .NET)
<%@ Page Language="VB" %> <script runat="server"> Sub Page_Load() Profile.PageVisits += 1 End Sub Sub UpdateProfile(ByVal s As Object, ByVal e As EventArgs) Profile.FirstName = txtFirstName.Text Profile.LastName = txtLastName.Text End Sub </script> <html> <head> <title>Simple</title> </head> <body> <form id="form1" runat="server"> <b>Name:</b> <%= Profile.FirstName %> <%= Profile.LastName %> <br /> <b>Page Visits:</b> <%= Profile.PageVisits %> <hr /> <b>First Name:</b> <asp:TextBox ID="txtFirstName" Runat="Server" /> <br /> <b>Last Name:</b> <asp:TextBox ID="txtLastName" Runat="Server" /> <br /> <asp:Button Text="Update Profile" OnClick="UpdateProfile" Runat="server" /> </form> </body> </html>
列表 2. Simple.aspx (C#)
<%@ Page Language="C#" %> <script runat="server"> void Page_Load() { Profile.PageVisits ++; } void UpdateProfile(Object s, EventArgs e) { Profile.FirstName = txtFirstName.Text; Profile.LastName = txtLastName.Text; } </script> <html> <head> <title>Simple</title> </head> <body> <form id="form1" runat="server"> <b>Name:</b> <%= Profile.FirstName %> <%= Profile.LastName %> <br /> <b>Page Visits:</b> <%= Profile.PageVisits %> <hr /> <b>First Name:</b> <asp:TextBox ID="txtFirstName" Runat="Server" /> <br /> <b>Last Name:</b> <asp:TextBox ID="txtLastName" Runat="Server" /> <br /> <asp:Button ID="Button1" Text="Update Profile" OnClick="UpdateProfile" Runat="server" /> </form> </body> </html>
如果你多次访问列表2中的页面,你会注意到PageVisits在不断增大。如果你关闭的浏览器,并在一周之后调用该页面,PageVisits属性仍然会保留原值。从这一点可以看出Profile为每个用户自动保存一个副本。 使用Profile组 尽管你仅可以为一个应用程序定义一个profile,但如果你需要让几个profile属性一起工作,把它们放在组中,会让你觉得它们更易管理。 例如,在列表3中,有一个带有两个组的profile,这两个组分别是Address和Preferences
列表3. Web.Config
<configuration> <system.web> <anonymousIdentification enabled="true" /> <profile> <properties> <group name="Address"> <add name="Street" allowAnonymous="true" /> <add name="City" allowAnonymous="true" /> </group> <group name="Preferences"> <add name="ReceiveNewsletter" type="Boolean" defaultValue="false" allowAnonymous="true" /> </group> </properties> </profile> </system.web> </configuration>
[Visual Basic .NET]
Profile.Address.City = "Modesto" Profile.Address.Street = "111 King Arthur Ln" Profile.Preferences.ReceiveNewsletter = False [C#] Profile.Address.City = "Modesto"; Profile.Address.Street = "111 King Arthur Ln"; Profile.Preferences.ReceiveNewsletter = false;
一个profile的定义只能包含一层组,换句话说,你不能把其他的组放在一个profile组的下面一层。 使用复杂的profile属性 到目前为止,我们已经介绍了声明包含简单类型(如string或整型)属性的profile,其实你也可以在profile中声明复杂属性。
列表4 Web.config
<configuration> <system.web> <anonymousIdentification enabled="true" /> <profile> <properties> <add name="ShoppingCart" type="ShoppingCart" serializeAs="Binary" allowAnonymous="true" /> </properties> </profile> </system.web> </configuration>
列表5 ShoppingCart (Visual Basic.NET)
Imports Microsoft.VisualBasic <Serializable()> _ Public Class ShoppingCart Public _CartItems As New Hashtable() ' Return all the items from the Shopping Cart Public ReadOnly Property CartItems() As ICollection Get Return _CartItems.Values End Get End Property ' The sum total of the prices Public ReadOnly Property Total() As Decimal Get Dim sum As Decimal For Each item As CartItem In _CartItems.Values sum += item.Price * item.Quantity Next Return sum End Get End Property ' Add a new item to the shopping cart Public Sub AddItem(ByVal ID As Integer, _ ByVal Name As String, ByVal Price As Decimal) Dim item As CartItem = CType(_CartItems(ID), CartItem) If item Is Nothing Then _CartItems.Add(ID, New CartItem(ID, Name, Price)) Else item.Quantity += 1 _CartItems(ID) = item End If End Sub ' Remove an item from the shopping cart Public Sub RemoveItem(ByVal ID As Integer) Dim item As CartItem = CType(_CartItems(ID), CartItem) If item Is Nothing Then Return End If item.Quantity -= 1 If item.Quantity = 0 Then _CartItems.Remove(ID) Else _CartItems(ID) = item End If End Sub End Class <Serializable()> _ Public Class CartItem Private _ID As Integer Private _Name As String Private _Price As Decimal Private _Quantity As Integer = 1 Public ReadOnly Property ID() As Integer Get Return _ID End Get End Property Public ReadOnly Property Name() As String Get Return _Name End Get End Property Public ReadOnly Property Price() As Decimal Get Return _Price End Get End Property Public Property Quantity() As Integer Get Return _Quantity End Get Set(ByVal value As Integer) _Quantity = value End Set End Property Public Sub New(ByVal ID As Integer, _ ByVal Name As String, ByVal Price As Decimal) _ID = ID _Name = Name _Price = Price End Sub End Class
列表5 ShoppingCart (c#)
using System; using System.Collections; [Serializable] public class ShoppingCart { public Hashtable _CartItems = new Hashtable(); // Return all the items from the Shopping Cart public ICollection CartItems { get { return _CartItems.Values; } } // The sum total of the prices public decimal Total { get { decimal sum = 0; foreach (CartItem item 全部评论
专题导读
上一篇:ASP.NETMVC+Jquery实现Ajax下拉框数据三级联动发布时间:2022-07-10下一篇:[引]VS2005主题(Theme)和外观(skin)帮助文档:如何应用ASP.NET主题发布时间:2022-07-10热门推荐
热门话题
阅读排行榜
|
请发表评论