ASP.NET 档案特征允许你存储简单(标量)值、集合以及其他复杂的类型,还有用户的自定义类型。
属性定义信息
当你在档案中定义一个属性的时候,你会指定一个将会用来对属性进行引用的名称。例如,如果你需要存储一个邮政编码,那么你可以把属性命名为 PostalCode 然后你就可以使用 Profile.PostalCode 来获取并且设置这个属性的值。
你可以有选择地为每个属性而定义下列额外的特征:
type
指定属性的类型。默认的类型是 String。你可以指定任何 .NET 类来作为类型(Int32、DateTime、StringCollection,等等)。如果类型没有被定义在 .NET Framework 中,那么你就必须确保你的 Web 应用程序能够对这个类型进行访问。你还可以在网站的 Bin 目录中或者全局汇编集缓存(GAC)中包括已编译的类型汇编集,或者你可以把该类型的源代码存放到网站的 App_Code 目录中。
serializeAs
指定序列化的格式(字符串、二进制、XML,或者特定提供者的序列化)。关于详细内容,请参考:[序列化]。默认的序列化格式是字符串。
allowAnonymous
指定一个 Boolean 值来表示匿名用户的属性是否能够被管理。默认时的值是 false。如果你需要属性对于未授权的用户可用,那么你可以把这个属性设置成 true。
defaultValue
指定属性的初始化值。
readOnly
指定一个 Boolean 值来表示属性是否能够被更改。
provider
为属性指定一个特定的提供者。默认时,所有属性都是使用为档案属性而指定的默认提供者而被管理的,但是单独的属性同样能够使用不同的提供者。
customProviderData
指定一个可选的字符串来包含被传递给档案提供者的自定义信息。单独的提供者还可以实现自定义的逻辑来使用这个数据。
另外,档案属性还能够使用 group(档案属性的 group 元素)配置元素而被组织成属性分组,这会在本文的稍后部分被描述。
操作标量值
把标量值保存成字符串、数字值,或者只需要最小化配置的档案中的 DateTime 值。你还必须提供相应的名称与类型。档案系统将会把属性值从被指定的类型转换到一个字符串并且作为一个必需的存储而返回。在你通过 Profile 属性来访问属性的时候,它将被转换成适当的类型。
例如,如果你需要存储用户的名称、体重,以及生日,那么你可以定义一个被命名为 Name 的 String 类型的属性,一个被命名为 Weight 的 Int32 类型的属性,还有一个被命名为 BirthDate 的 DateTime 类型的属性。配置文件中的属性定义如下所示:
<profile defaultProvider="AspNetSqlProfileProvider"> <properties> <add name="Name" /> <add name="Weight" type="System.Int32" /> <add name="BirthDate" type="System.DateTime" /> </properties> </profile>
关于 Name 属性,你不需要明确地指定一个类型,因为属性的类型在默认的时候就是 String。而关于任何其他的类型,你就必须提供一个完全合格的类型引用。
在你获取或者设置属性值的时候,你就需要在你的代码中操作适当的类型。下列代码范例说明了如何操作 BirthDate 属性:
DateTime bday = Profile.BirthDate;
操作复杂的属性类型
你同样能够在用户档案中存储复杂的类型(比如集合)。关于复杂的类型,你必须提供与类型的序列化方式相关的信息,这样档案系统才能够使用适当的类型来获取并且设置属性的值。
下列范例说明了一个被类型化成集合的属性值定义:
<profile defaultProvider="AspNetSqlProfileProvider"> <properties> <add name="FavoriteURLs" type="System.Collection.Specialized.StringCollection" serializeAs="Xml" /> </properties> </profile>
要设置这种类型的属性,你可能需要使用如下所示的代码:
System.Collections.Specialized.StringCollection favorites; favorites = Profile.FavoriteURLs;
操作用户自定义的属性类型
你同样能够存储并且使用自定义类型实例的档案属性值。自定义类型必须为你需要存储到用户档案中的成员而提供序列化支持。
下列代码范例说明了一个简单的 ShoppingCart 类来对一个轮流存储子项标识符、名称,以及价格的 Cart 子项集合进行维护:
namespace Samples.AspNet.Profile { [Serializable] public class ShoppingCart { public DateTime Created; public DateTime LastUpdated; public CartItemCollection CartItems = new CartItemCollection(); } [Serializable] public class CartItemCollection : System.Collections.Hashtable { } [Serializable] public class CartItem { public CartItem(int itemId, string itemName, double itemCost) { ID = itemId; Name = itemName; Cost = itemCost; } int ID; string Name; double Cost; } }
要配置用户档案来使用这个类的实例,就需要在应用程序的 Web.config 文件中添加下列部分:
<profile defaultProvider="AspNetSqlProfileProvider"> <properties> <add name="MyCart" type="Samples.AspNet.Profile.ShoppingCart" serializeAs="Binary" /> </properties> </profile>
要在用户档案中存储自定义的类型数据,就需要在当前应用程序中为自定义类创建一个实例,然后把它指派到被你为该类型而定义的档案属性中。下列代码范例说明了如何操作一个被创建成自定义类型的档案属性:
ShoppingCart bookCart = new ShoppingCart(); bookCart.CartItems.Add("Contoso", new CartItem(37843, "Widget", 49.99); bookCart.CartItems.Add("Microsoft", new CartItem(39232, "Software", 49.99); Profile.MyCart = bookCart;
操作属性分组
用户档案中的属性能够被组织成属性的分组。可以使用 group(档案属性的 group 元素)配置元素来指定档案属性的分组。例如,与用户地址信息相关的不同属性就能够被合并到一个 Address 分组中。然后你可以使用分组标识符与属性的名称来访问被分组的属性(例如,Profile.Address.Street 或者 Profile.Address.City)。下列范例说明了一个把若干属性组成到一个分组中的档案属性配置。
<profile enabled="true"> <properties> <add name="PostalCode" /> <group name="Address"> <add name="Street" /> <add name="City" /> <add name="CountryOrRegion" /> </group> </properties> </profile>