定义 ASP.NET 配置文件属性
更新:2007 年 11 月
ASP.NET 配置文件功能允许您存储简单(标量)值、集合和其他复杂类型,以及用户定义的类型。
属性定义信息
在配置文件中定义属性时,应指定将用于引用该属性的名称。例如,如果要存储邮政编码,则可以将属性命名为 PostalCode,然后可以获取属性值并将其设置为 Profile.PostalCode。
可以选择为各个属性定义以下附加特性:
type 指定属性的类型。默认为 String。可以将任何 .NET 类指定为类型(Int32、DateTime、StringCollection 等)。如果 .NET Framework 中没有定义该类型,则必须确保 Web 应用程序可以访问该类型。可以在网站的 Bin 目录中或全局程序集缓存 (GAC) 中包含该类型编译后的程序集,也可以将该类型的源代码放入网站的 App_Code 目录中。
serializeAs 指定序列化格式化程序(字符串、二进制、XML 或提供程序特定的序列化)。有关详细信息,请参见序列化。默认序列化为字符串。
allowAnonymous 指定一个布尔值,该布尔值指示是否为匿名用户托管属性。默认情况下,该属性为 false。如果希望未经身份验证的用户使用该属性,则可以将该属性设置为 true。
defaultValue 指定属性初始化时使用的值。
readOnly 指定一个布尔值来指示属性是否可修改。
provider 指定特定于属性的提供程序。默认情况下,使用为配置文件属性指定的默认提供程序对所有属性进行管理,但个别属性也可以使用不同的提供程序。
customProviderData 指定一个包含自定义信息的可选字符串,该字符串将被传递给配置文件提供程序。各个提供程序可实现自定义逻辑来使用此数据。
此外,可使用 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 属性:
Dim bday As DateTime = Profile.BirthDate
DateTime bday = Profile.BirthDate;
使用复杂的属性类型
还可以在用户配置文件中存储集合等复杂类型。对于复杂类型,必须提供有关如何序列化该类型的信息,使配置文件系统可以获取属性值并将属性值设置为正确的类型。
下面的示例显示类型化为集合的值的属性定义:
<profile defaultProvider="AspNetSqlProfileProvider">
<properties>
<add name="FavoriteURLs" type="System.Collections.Specialized.StringCollection" serializeAs="Xml" />
</properties>
</profile>
若要设置此类型的属性,可以使用如下代码:
Dim favorites As System.Collections.Specialized.StringCollection
favorites = Profile.FavoriteURLs
System.Collections.Specialized.StringCollection favorites;
favorites = Profile.FavoriteURLs;
使用用户定义的属性类型
也可以存储和使用配置文件属性值,这些属性值是您自己创建的类的实例。创建的类必须支持要存储在用户配置文件中的成员的序列化。
下面的代码示例说明一个简单的 ShoppingCart 类,该类维护 Cart 项的集合,而这些项存储项标识符、名称和成本:
Namespace Samples.AspNet.Profile
<Serializable()> _
Public Class ShoppingCart
Public Created As DateTime
Public LastUpdated As DateTime
Public CartItems As Dictionary(Of String, CartItem) = _
New Dictionary(Of String, CartItem)()
End Class
<Serializable()> _
Public Class CartItem
Public Sub New(itemId As Integer, itemName As String, _
itemCost As Double)
ID = itemId
Name = itemName
Cost = itemCost
End Sub
Dim ID As Integer
Dim Name As String
Dim Cost As Double
End Class
End Namespace
namespace Samples.AspNet.Profile
{
[Serializable]
public class ShoppingCart {
public DateTime Created;
public DateTime LastUpdated;
public Dictionary<string, CartItem> CartItems = new Dictionary<string, CartItem>();
}
[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>
若要将自定义类型数据存储到用户配置文件中,如同在任何应用程序中一样,创建自定义类型的一个实例,然后将该实例分配给为该类型定义的配置文件属性。下面的代码示例演示如何使用一个以自定义类型创建的配置文件属性:
Dim bookCart As ShoppingCart = 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
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 配置元素指定配置文件属性组。例如,可将用户地址信息的不同属性组织到一个 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>