[索引页]
[×××]



温故知新ASP.NET 2.0(C#)(7) - Profile(存储用户配置)


作者:webabcd


介绍
ASP.NET 2.0 中的存储用户配置功能使您可以定义并存储要在整个应用程序中使用的基于用户的设置。而且,在用户未登录时,可以将这些设置存储在匿名配置文件中,然后在将来某个时间将其迁移到登录用户的配置文件中。


关键
1、配置<system.web>元素下的<profile>元素;如果需要支持匿名的话则还需要配置<system.web>元素下的<anonymousIdentification>元素。示例如下,仅为说明
<profile enabled="true" defaultProvider="SqlProfileProvider" inherits="CustomProfile">
            <providers>
                <add name="SqlProfileProvider" type="System.Web.Profile.SqlProfileProvider, System.Web, Version=2.0.3600.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"
                         connectionStringName="SqlConnectionString"
                         applicationName="/" />
            </providers>
            <properties>
                <add name="Name" />
                <add name="Color" type="System.Drawing.Color" />
                <group name="Group">
                    <add name="Collection" type="System.Collections.ArrayList" />
                    <add name="Price" type="int" defaultValue="100" />
                </group>
            </properties>
        </profile>

        <anonymousIdentification
            enabled="true"
            cookieName=".VS2005_ANONYMOUS"
            cookieTimeout="1440"
            cookiePath="/"
            cookieRequireSSL="false"
            cookieSlidingExpiration="true"
            cookieProtection="All"
            cookieless="UseCookies" />
各属性详细说明参看MSDN,索引处查找“profile 元素”和“anonymousIdentification 元素”

注意:
<profile>元素的inherits属性指定自定义类,该类要继承自ProfileBase

Profile是自动保存的,但是某些复杂类型可能无法自动保存,此时需要设置<profile>元素的automaticSaveEnabled设置为false,要保存的话则调用 Profile 上的 Save 方法即可。要动态取消Profile的自动保存功能的话则需要在 global.asax 中加一个Profile_ProfileAutoSaving事件,示例如下,仅为说明
void Profile_ProfileAutoSaving(Object sender, ProfileAutoSaveEventArgs e)
        {
                if ((e.Context.Items["CancelProfileAutoSave"] != null) && ((bool)e.Context.Items["CancelProfileAutoSave"] == true))
                        e.ContinueWithProfileAutoSave = false;
        }
在需要取消Profile的自动保存功能的页的代码处如下写
protected void Page_Load(object sender, EventArgs e)
{
    Context.Items["CancelProfileAutoSave"] = true;        
}
 
 
2、通过ProfileManager执行相关任务,如搜索有关所有配置文件、经过身份验证用户的配置文件及匿名用户的配置文件的统计信息,确定在给定时间段内尚未修改的配置文件的数量,根据配置文件的上一次修改日期删除单个配置文件及多个配置文件等

3、将匿名配置文件迁移到经过身份验证的配置文件
在global.asax加一个Profile_MigrateAnonymous事件处理,示例如下,仅为说明
void Profile_MigrateAnonymous(Object sender, ProfileMigrateEventArgs pe)
        {
            // 获得匿名配置
            ProfileCommon anonProfile = Profile.GetProfile(pe.AnonymousID);

            // 从匿名配置中取值并赋值给经过身份验证的配置
            if (anonProfile.Color != System.Drawing.Color.Empty)
            {
                Profile.Color = anonProfile.Color;
            }
                
            // 从数据库中删除匿名配置
            ProfileManager.DeleteProfile(pe.AnonymousID);
                
            // 清除与某个会话关联的匿名 Cookie 或标识符
            AnonymousIdentificationModule.ClearAnonymousIdentifier();    
        }
 
示例
App_Code/CustomProfile.cs
using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;

using System.Web.Profile;

/// <summary>
/// CustomProfile 的摘要说明
/// </summary>
public class CustomProfile : ProfileBase
{
        private string _customName;
        public string CustomName
        {
                get { return (string)base["CustomName"]; }
                set { base["CustomName"] = value; }
        }

        private bool _customSex;
        public bool CustomSex
        {
                get { return (bool)base["CustomSex"]; }
                set { base["CustomSex"] = value; }
        }
}
 
web.config
<profile enabled="true" defaultProvider="SqlProfileProvider" inherits="CustomProfile">
            <providers>
                <add name="SqlProfileProvider" type="System.Web.Profile.SqlProfileProvider, System.Web, Version=2.0.3600.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"
                         connectionStringName="SqlConnectionString"
                         applicationName="/" />
            </providers>
            <properties>
                <add name="Name" />
                <add name="Color" type="System.Drawing.Color" />
                <group name="Group">
                    <add name="Collection" type="System.Collections.ArrayList" />
                    <add name="Price" type="int" defaultValue="100" />
                </group>
            </properties>
        </profile>
 
Profile/Test.aspx
<%@ Page Language="C#" MasterPageFile="~/Site.master" AutoEventWireup="true" CodeFile="Test.aspx.cs"
        Inherits="Profile_Test" Title="存储用户配置测试" %>

<asp:Content ID="Content1" ContentPlaceHolderID="ContentPlaceHolder1" runat="Server">
        <asp:Label ID="lbl" runat="Server" />
</asp:Content>
 
Profile/Test.aspx.cs
using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;

public partial class Profile_Test : System.Web.UI.Page
{
        protected void Page_Load(object sender, EventArgs e)
        {
                // 一看就懂
                Profile.Name = User.Identity.Name;
                Profile.Color = System.Drawing.Color.AliceBlue;
                Profile.Group.Collection.Clear();
                Profile.Group.Collection.Add("冰棍");
                Profile.Group.Collection.Add("瓜子");
                Profile.Group.Price = 999999;

                Profile.CustomName = User.Identity.Name;
                Profile.CustomSex = true;



                lbl.Text = "Name:" + Profile.Name + "<br />";
                lbl.Text += "Color:" + Profile.Color.ToString() + "<br />";
                foreach (string s in Profile.Group.Collection)
                {
                        lbl.Text += "商品有:" + s + "<br />";
                }
                lbl.Text += "价格:" + Profile.Group.Price + "<br />";

                lbl.Text += "自定义类名字:" + Profile.CustomName + "<br />";
                lbl.Text += "自定义类姓名:" + Profile.CustomSex;
        }
}
 
用“abc”这个用户登录后的运行结果
Name:abc
Color:Color [AliceBlue]
商品有:冰棍
商品有:瓜子
价格:999999
自定义类名字:abc
自定义类姓名:True


注:需要用aspnet_regsql配置数据库


OK
[×××]