在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
为每个用户存储配置信息
强类型 长期保存 支持匿名用户 定义配置(profile)
<?xml version="1.0"?>
<configuration xmlns="http://schemas.microsoft.com/.NetConfiguration/v2.0"> <appSettings/> <connectionStrings> <add name="Northwind" connectionString="Server=localhost;Integrated Security=True;Database=Northwind" providerName="System.Data.SqlClient"/> </connectionStrings> <system.web> <anonymousIdentification enabled="true" /> <profile> //定义配置(profile) <properties> <add name="Theme" allowAnonymous="true" /> <add name="LastVisit" type="System.DateTime" allowAnonymous="true" /> </properties> </profile> <!-- <webParts> //定义配置(webParts) <personalization defaultProvider="AspNetSqlPersonalizationProvider"/> </webParts> --> <!-- Set compilation debug="true" to insert debugging symbols into the compiled page. Because this affects performance, set this value to true only during development. --> <compilation debug="true"> <expressionBuilders> <add expressionPrefix="Version" type="VersionExpressionBuilder"/> </expressionBuilders> </compilation> <!-- The <authentication> section enables configuration of the security authentication mode used by ASP.NET to identify an incoming user. --> <authentication mode="Windows"/> <!-- The <customErrors> section enables configuration of what to do if/when an unhandled error occurs during the execution of a request. Specifically, it enables developers to configure html error pages to be displayed in place of a error stack trace. --> <customErrors mode="RemoteOnly" defaultRedirect="GenericErrorPage.htm"> <!-- <error statusCode="403" redirect="NoAccess.htm"/> <error statusCode="404" redirect="FileNotFound.htm"/> --> </customErrors> </system.web> </configuration> 使用配置(profile) //increment the current user's post cout profile.posts = profile.posts+1; // update the current user's last post date profile.lastpost = datetime.now; 个性化数据将存入数据库 介绍 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需要同时被匿名用户和已认证用户使用,因此我们在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特性。
[Visual Basic .NET]
Profile.FirstName = "Bill" [C#] Profile.FirstName = "Bill";
任何在web.config中定义的profile属性都会在Profile对象中呈现。
图1 使用简单的profile
列表 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属性一起工作,把它们放在组中,会让你觉得它们更易管理。 例如,在列表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> 当你用组来定义profile时,你应该使用组名来设置或读取profile属性。例如,在列表3中,你可以使用以下一些句子来完成三个profile属性的赋值。
[C#]
Profile.Address.City = "Modesto"; Profile.Address.Street = "111 King Arthur Ln"; Profile.Preferences.ReceiveNewsletter = false; 一个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 中有一个简单购物篮的实现代码,该购物篮拥有添加和删除项(item)的方法(method),同时它还拥有两个属性(property),一个是用于获得该购物篮中的所有项的,一个是用于表示所有商品的总价的。
列表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 in _CartItems.Values) sum += item.Price * item.Quantity; return sum; } } // Add a new item to the shopping cart public void AddItem(int ID, string Name, decimal Price) { CartItem item = (CartItem)_CartItems[ID]; if (item == null) _CartItems.Add(ID, new CartItem(ID, Name, Price)); else { item.Quantity++; _CartItems[ID] = item; } } // Remove an item from the shopping cart public void RemoveItem(int ID) { CartItem item = (CartItem)_CartItems[ID]; if (item == null) return; item.Quantity--; if (item.Quantity == 0) _CartItems.Remove(ID); else _CartItems[ID] = item; } } [Serializable] public class CartItem { private int _ID; private string _Name; private decimal _Price; private int _Quantity = 1; public int ID { get { return _ID; } } public string Name { get { return _Name; } } public decimal Price { get { return _Price; } } public int Quantity { get { return _Quantity; } set { _Quantity = value; } } public CartItem(int ID, string Name, decimal Price) { _ID = ID; _Name = Name; _Price = Price; } } 如果你把列表5中的代码添加到应用程序的App_Code目录中,购物篮会自动被编译。
在列表5中有一点值得注意,那就是ShoppingCart和CartItem类都加上了可序列化的特性,这一点对于他们能否被序列化十分重要,只有这样才能保存在Profile对象中。 图2 在profile中存储购物篮 AddCartItem方法用于在购物篮中添加一个产品,该方法中包含了检测Profile是否存在ShoppingCart的代码。对于Profile中存储的对象,你必须自己实例化这些对象,他们不会自动实例化。 RemoveCartItem方法用于从购物篮中移除一个产品,该方法只是简单地通过调用Profile中的ShoppingCart对象的RemoveItem方法。
列表 6. Products.aspx (C#)
<%@ Page Language="C#" %> <%@ Import Namespace="System.Globalization" %> <script runat="server"> void Page_Load() { if (!IsPostBack) BindShoppingCart(); } void BindShoppingCart() { if (Profile.ShoppingCart != null) { CartGrid.DataSource = Profile.ShoppingCart.CartItems; CartGrid.DataBind(); lblTotal.Text = Profile.ShoppingCart.Total.ToString("c"); } } void AddCartItem(Object s, EventArgs e) { GridViewRow row = ProductGrid.SelectedRow; int ID = (int)ProductGrid.SelectedDataKey.Value; String Name = row.Cells[1].Text; decimal Price = Decimal.Parse(row.Cells[2].Text, NumberStyles.Currency); if (Profile.ShoppingCart == null) Profile.ShoppingCart = new ShoppingCart(); Profile.ShoppingCart.AddItem(ID, Name, Price); BindShoppingCart(); } void RemoveCartItem(Object s, EventArgs e) { int ID = (int)CartGrid.SelectedDataKey.Value; Profile.ShoppingCart.RemoveItem(ID); BindShoppingCart(); } </script> <html> <head> <title>Products</title> </head> <body> <form id="form1" runat="server"> <table width="100%"> <tr> <td valign="top"> <h2>Products</h2> <asp:GridView ID="ProductGrid" DataSourceID="ProductSource" DataKeyNames="ProductID" AutoGenerateColumns="false" OnSelectedIndexChanged="AddCartItem" ShowHeader="false" CellPadding="5" Runat="Server 全部评论
专题导读
上一篇:My Asp.net Ajax Trip(一) ----Using For UpdatePanel发布时间:2022-07-10下一篇:asp.net mvc源码分析-路由篇 如何找到 IHttpHandler发布时间:2022-07-10热门推荐
热门话题
阅读排行榜
|
请发表评论