13.2 实现个性化用户配置
知识点讲解:光盘:视频\PPT讲解(知识点)\第13章\实现个性化用户配置.mp4
本节将向读者演示实现个性化配置的方法。ASP.NET中的个性化配置分为匿名用户个性化用户配置和注册用户个性化用户配置两种,如图13-6所示。
图13-6 实现个性化用户配置
13.2.1 匿名用户个性化用户配置
在默认情况下,个性化配置只能用于授权用户。为了使个性化配置也能用于匿名用户,必须在配置文件中启用匿名用户,并逐个设置能用于匿名用户的每个个性化配置属性。
实例066 演示匿名用户的个性化用户配置
源码路径 光盘\daima\13\web 视频路径 光盘\视频\实例\第13章\066
本实例演示了为匿名用户实现简单数据类型个性化配置的方法,即通过上节中创建的ASPNETDB.MDF数据库,实现对应的个性化功能效果。本实例的具体操作过程如下。
(1)设置Web.Config文件,用于指定允许匿名访问。其主要实现代码如下。
<?xml version="1.0"?>
<configuration>
<appSettings/>
<connectionStrings/>
<system.web>
<!--设置验证方式为Forms-->
<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"/>
</group>
</properties>
</profile>
范例131:绘制直线、矩形和多边形
源码路径:光盘\演练范例\131
视频路径:光盘\演练范例\131
范例132:绘制圆形、椭圆形和扇形
源码路径:光盘\演练范例\132
视频路径:光盘\演练范例\132
(2)编写信息显示页面文件Simple.aspx,其主要实现代码如下。
<script runat="server">
void Page_Load()
{
Profile.PageVisits++;
}
void UpdateProfile(Object s, EventArgs e)
{
Profile.FirstName = txtFirstName.Text;
Profile.LastName = txtLastName.Text;
}
</script>
……
<body>
<form id="form1" runat="server">
<b>名字:</b> <%= Profile.FirstName %> <%= Profile.LastName %>
<br />
<b>数量:</b> <%= Profile.PageVisits %>
<hr />
<b>全名:</b>
<asp:TextBox ID="txtFirstName" Runat="Server" />
<br />
<b>昵称:</b>
<asp:TextBox ID="txtLastName" Runat="Server" />
<br />
<asp:Button ID="Button1"
Text="Update Profile"
OnClick="UpdateProfile"
Runat="server" />
</form>
由此可见,所有在文件Web.Config中定义的profile属性都会在Profile对象中呈现出来。在上述Simple.aspx文件中,通过使用profile属性持久保存了用户信息,分别显示了FirstName、LastName和PageVisits的值。这就说明每刷新一次当前页面时,PageVisits的值都会递增改变。如果关闭浏览器,则以后再调用该页面时,PageVisits属性仍然会保留原来的值。
在上述应用中,默认的profile属性类型是System.String。因为上述实例中没有为FirstName和LastName的profile属性设置type属性,所以系统都默认它们为String类型。PageVisits属性指定了type为Int32,所以该profile属性可以用于表示一个整数值。FirstName和LastName也都具有defaultValue特性,可以为简单的数据类型设置defaultValue特性,但是不能为复杂类型设置defaultValue特性。
除了上述应用外,还可以使用profile Group为匿名用户实现简单数据类型的个性化用户配置。例如使用下面的配置文件Web.Config。
<profile>
<properties>
<add name="FirstName" defaultValue="??" allowAnonymous="true"/>
<add name="LastName" defaultValue="??" allowAnonymous="true"/>
<add name="PageVisits" type="Int32" allowAnonymous="true"/>
<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>
然后可以通过专用文件Group.aspx对组名和属性名进行赋值,并在网页中引用显示出来。主要实现代码如下。
<%@ Page Language="C#|" %>
……
<script runat="server">
void Page_Load()
{
Profile.Address.City = "济南";
Profile.Address.Street = "厉害";
Profile.Preferences.ReceiveNewsletter = false;
}
</script>
……
<body>
<form id="form1" runat="server">
<b>城市:</b> <%= Profile.Address.City %> <b>区/县:</b> <%= Profile.Address.Street%>
<br />
<b>有新邮件吗:</b> <%= Profile.Preferences.ReceiveNewsletter %>
</form>
在上述代码中,通过profile Group为匿名用户实现了简单数据类型的个性化用户配置。一个profile定义只能包含一层组,不能把其他的组放在一个profile组的下一层,即不能嵌套使用。
13.2.2 注册用户个性化用户配置
除了能够为匿名用户创建个性化用户配置外,还可以对注册用户创建个性化用户配置,这就需要在profile中声明更加复杂的属性。例如,需要在profile中存储一个购物车信息,便于注册用户登录站点后获得自己的购物车,这就需要使用复杂数据类型的个性化用户配置。
实例067 为注册用户实现个性化用户配置
源码路径 光盘\daima\13\web 视频路径 光盘\视频\实例\第13章\067
本实例的功能是为注册用户实现个性化用户配置,即为注册用户实现复杂数据类型的个性化用户配置的购物车提示。具体实现过程如下。
(1)设置Web.Config文件,定义一个profile,其中包含一个ShoppingCart属性,此属性的Type特性是一个ShoppingCart类。另外,在声明中还包含了一个serializeAs特性,此特性可以确保ShoppingCart使用二进制序列器进行持久化,而不是使用XML序列化器。文件Web.Config的实现代码如下。
<profile>
<properties>
<add name="ShoppingCart"
type="ShoppingCart"
serializeAs="Binary"
allowAnonymous="true"
/>
</properties>
</profile>
(2)根据需要,需定义一个ShoppingCart类,实现购物车处理。此处将ShoppingCart类定义在文件ShoppingCart.cs中,保存在“App_Code”目录下,主要实现代码如下。
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;
}
}
范例133:混合验证码
源码路径:光盘\演练范例\133
视频路径:光盘\演练范例\133
范例134:汉字验证码
源码路径:光盘\演练范例\134
视频路径:光盘\演练范例\134
在上述代码中,为ShoppingCart类和CartItem类都加上了可序列化的特性。
(3)编写调用页面文件Products.aspx,用于调用数据库内商品的基本信息,并为用户提供一个指定格式的购物车。具体实现代码如下。
<%@ 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>商品</h2>
<asp:GridView
ID="ProductGrid"
DataSourceID="ProductSource"
DataKeyNames="ProductID"
AutoGenerateColumns="false"
OnSelectedIndexChanged="AddCartItem"
ShowHeader="false"
CellPadding="5"
Runat="Server">
<Columns>
<asp:ButtonField
CommandName="select"
Text="购买" />
<asp:BoundField
DataField="ProductName" />
<asp:BoundField
DataField="UnitPrice"
DataFormatString="{0:c}" />
</Columns>
</asp:GridView>
<asp:SqlDataSource
ID="ProductSource"
ConnectionString=
"Server=hp;Database=Northwind;Trusted_Connection=true;"
SelectCommand=
"SELECT ProductID,ProductName,UnitPrice FROM Products"
Runat="Server" />
</td>
<td valign="top">
<h2>我的购物车</h2>
<asp:GridView
ID="CartGrid"
AutoGenerateColumns="false"
DataKeyNames="ID"
OnSelectedIndexChanged="RemoveCartItem"
CellPadding="5"
Width="300"
Runat="Server">
<Columns>
<asp:ButtonField CommandName="select" Text="删除" />
<asp:BoundField DataField="Name" HeaderText="名称" />
<asp:BoundField DataField="Price" HeaderText="价格" DataFormatString= "{0:c}" />
<asp:BoundField DataField="Quantity" HeaderText="数量" />
</Columns>
</asp:GridView>
<b>Total:</b>
<asp:Label ID="lblTotal" Runat="Server" />
</td>
</tr>
</table>
</form>
</body>
</html>
经过上述文件处理后,分别在商品列表和购物车列表内实现了对商品信息的数据绑定,如图13-7所示。
图13-7 数据绑定