定義 ASP.NET 設定檔屬性
更新:2007 年 11 月
ASP.NET 設定檔功能可以讓您儲存簡單的 (純量) 值、集合與其他複雜型別,以及使用者定義型別。
屬性定義資訊
當您在設定檔定義一個屬性時,會指定用於表示該屬性的名稱。例如,如果想要儲存郵遞區號,可以將屬性命名為 PostalCode,然後就能夠以 Profile.PostalCode 來取得並設定此屬性值。
此外,還可以選擇性地為每個屬性定義如下的其他特性:
type:會指定屬性的型別。預設值為 String。您可以指定任何 .NET 類別當做型別 (Int32、DateTime、StringCollection 等)。如果 .NET Framework 中並未定義此型別,則必須確定 Web 應用程式可以存取此型別。您可以在網站的 Bin 目錄或是在全域組件快取 (GAC) 中包含已編譯的型別組件,或是將型別的原始程式碼放在網站的 App_Code 目錄中。
serializeAs:會指定序列化格式子 (字串、二進位、XML 或特定提供者的序列化)。如需詳細資訊,請參閱序列化。預設序列化是 string。
allowAnonymous:會指定布林值以表示此屬性是否由匿名使用者所管理。根據預設,這是 false。如果您想要讓未經驗證的使用者可以使用此屬性,可以將此屬性設定為 true。
defaultValue:會指定要用以初始化屬性的值。
readOnly:會指定布林值,表示是否可以修改此屬性。
provider:會指定屬性的特定提供者。根據預設,會使用為設定檔屬性指定的預設提供者來管理所有屬性,但是個別屬性也可以使用不同的提供者。
customProviderData:會指定包含傳遞給設定檔提供者之自訂資訊的選擇性字串。個別提供者可以實作能夠使用這份資料的自訂邏輯。
此外,您可以使用 group 組態項目將設定檔屬性組織為屬性群組,本主題稍後會再討論該組態項目。
使用純量值
在設定檔中儲存例如字串、數值或 DateTime 值的純量值,只需要進行少許組態設定。您必須提供名稱和型別。設定檔系統會從指定的型別將值轉換為字串,並且依需要轉換回原本的型別以便儲存。當您經由 Profile 屬性存取屬性時,將會是正確的型別。
例如,如果您想要儲存使用者的姓名、體重和生日,可以使用 String 型別定義名為 Name 的屬性、使用 Int32 型別定義另一個名為 Weight 的屬性,以及使用 DateTime 型別定義第三個名為 BirthDate 的屬性。在組態檔中,屬性定義看起來會如下所示:
<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>