演练:用配置文件属性维护网站用户信息

更新:2007 年 11 月

ASP.NET Profile 属性允许应用程序跟踪并永久性存储用户特定的信息。例如,用户可以指定邮政编码或最满意的配色方案,然后应用程序可以存储该信息并从应用程序的任何位置检索此信息。ASP.NET 自动将当前用户与为他们的用户帐户存储的个人信息匹配 — 无论是匿名用户还是登录用户。

本演练演示如何将 Profile 属性添加到应用程序,以及如何使用 Profile 属性为网站的访问者创造个性化体验。

通过此演练,您将学会如何执行以下任务:

  • 配置应用程序以使用 Profile 属性

  • 定义要为用户维护的简单和复杂 Profile 属性。

  • 在应用程序中设置和检索 Profile 值。

  • 使用包括匿名用户和登录用户的 Profile 属性。

先决条件

为了完成本演练,您需要:

  • Microsoft Visual Web Developer。

  • Microsoft .NET Framework。

  • Microsoft SQL Server 标准版。

    在本演练中创建的 Profile 属性信息将存储在 SQL Server 标准版数据库中。

  • 在浏览器上启用 Cookie。

    说明:

    如果应用程序配置为不使用 Cookie,ASP.NET Profile 属性也可以在没有 Cookie 的情况下工作。但在本演练中,将使用 Profile 属性的默认配置设置,此默认设置使用 Cookie。

创建和配置网站

如果已经通过完成 演练:在 Visual Web Developer 中创建基本网页 中的步骤,在 Microsoft Visual Studio 中创建了一个网站,可以使用此网站并转至下一节。否则,按照下面的步骤创建一个新的网站。

创建文件系统网站

  1. 打开 Visual Studio。

  2. 在“文件”菜单上指向“新建”,然后单击“网站”(或在“文件”菜单上单击“新建网站”)。

    出现“新建网站”对话框。

  3. 在“Visual Studio 已安装的模板”之下单击“ASP.NET 网站”。

  4. 在最左侧的“位置”列表中单击“文件系统”。

  5. 在最右侧的“位置”列表中输入要保存网站网页的文件夹的名称。

    例如,键入文件夹名“C:\WebSites”。

  6. 在“语言”列表中,单击您想使用的编程语言。

  7. 单击“确定”。

    Visual Web Developer 创建该文件夹和一个名为 Default.aspx 的新页。

配置配置文件属性

使用 ASP.NET Profile 属性前,先配置应用程序,以便启用和定义要为每个用户跟踪的 Profile 属性。首先,将创建单个 PostalCode 属性,网站将跟踪用户的此属性。还将配置 PostalCode 属性,以便网站既可以为匿名用户,也可以为登录用户跟踪此属性。

首先以匿名用户的身份进行操作。ASP.NET 将在后台为您分配一个唯一的匿名 ID,此 ID 存储在计算机的某个 Cookie 中。ASP.NET 可以使用此匿名 ID 设置和获取您特有的值。

在网站中配置配置文件属性

  1. 在解决方案资源管理器中,确定网站是否已有 Web.config 文件。

    如果网站没有 Web.config 文件,请执行以下步骤:

    1. 右击网站的名称。

    2. 单击“添加新项”。

    3. 在“Visual Studio 已安装的模板”之下单击“Web 配置文件”。

    4. 单击“添加”。

      名为 Web.config 的新文件即会添加到网站,并在编辑器中打开。

  2. 将以下 <profile> 元素作为 <system.web> 元素的子项添加到 Web.config 文件:

    <system.web>
    
      <anonymousIdentification enabled="true" />  <profile>    <properties>      <add name="PostalCode"         type="System.String"         allowAnonymous="true" />    </properties>  </profile>
    
    <!-- other Web.config settings here -->
    </system.web>
    
    说明:

    Web.config 文件中的元素区分大小写。因此,请确保按显示准确复制或键入元素。

    您已经添加了以下元素:

    • <anonymousIdentification> 元素,此元素指定 Profile 属性是只用于登录(经过身份验证)用户还是同时用于登录和匿名用户。

      在本例中,已经将 enabled 设置为 true。因此,将同时为登录用户和匿名用户跟踪 Profile 属性信息。

    • <properties> 元素,此元素包含将定义的所有 Profile 属性。

    • <add> 元素,此元素定义新的 <profile> 元素。

      在本例中,已经定义了名为 PostalCode 的单个 Profile 属性。

      定义 Profile 属性时,使用 .NET Framework 类型的类名指定此属性的数据类型。还要指定是否跟踪匿名用户的 Profile 属性。启用匿名身份验证后,还可以指定是否分别跟踪匿名用户的 Profile 属性。

      为要定义的每个其他 Profile 属性创建一个新的 add 元素。

      说明:

      默认情况下,用户的配置文件信息存储在网站的 Application_Data 子目录中的 SQL Server 标准版数据库中。本演练使用默认配置。在支持大量用户的生产应用程序中,最好将 Profile 属性数据存储在 Microsoft SQL Server 数据库中。有关更多信息,请参见本演练中稍后的“后续步骤”。

设置和获取 PostalCode 属性

配置网站以跟踪 Profile 属性后,可以像处理普通组件属性一样设置和获取 Profile 属性。在本节中,将创建一个页面,此页面显示如何设置和获取在上一节中定义的 PostalCode 值。

创建页面以设置和获取 PostalCode 属性

  1. 将新网页添加到名为 Profiles.aspx 的网站。

  2. 打开 Profiles.aspx 并切换到“设计”视图。

  3. 从工具箱的“标准”组中,将在下表中列出的控件拖动到页面上,然后按照说明设置它们的属性。

    控件

    属性设置

    TextBox

    ID = textPostalCode

    Button

    ID = SetPostalCode

    Text = 设置邮政编码

    Label

    ID = labelPostalCode

    Text =(空)

  4. 切换到“源”视图,然后将以下属性添加到“SetPostalCode”按钮(如果此属性不存在)。

    OnClick="SetPostalCode_Click"
    
  5. 为“设置邮政编码”创建一个 Click 处理程序,然后添加下面突出显示的代码。

    Sub SetPostalCode_Click(ByVal sender As Object, _
            ByVal e As System.EventArgs)
        Profile.PostalCode = Server.HtmlEncode(textPostalCode.Text)    labelPostalCode.Text = Profile.PostalCode
    End Sub
    
    void SetPostalCode_Click(object sender, System.EventArgs e)
    {
        Profile.PostalCode = Server.HtmlEncode(textPostalCode.Text);    labelPostalCode.Text = Profile.PostalCode;
    }
    

    如果启用用户配置文件,ASP.NET 将动态创建名为 Profile 的属性,此属性将用户配置文件添加到当前上下文。然后,可以通过 Profile.PostalCode 使用每个 Profile 属性。

  6. 创建 Page_Load 处理程序,然后添加下面突出显示的代码。

    Sub Page_Load(ByVal sender As Object, ByVal e As EventArgs)
        labelPostalCode.Text = Profile.PostalCode
    End Sub
    
    void Page_Load(object sender, System.EventArgs e)
    {
        labelPostalCode.Text = Profile.PostalCode;
    }
    

    每次请求页面时,此代码将显示 Profile.PostalCode 值。

测试 PostalCode 配置文件属性

现在可以测试在上一节中定义的 PostalCode 属性。

说明:

如果正在使用已启用成员资格的现有网站,请确定您已注销。

测试 PostalCode 属性

  1. 按 Ctrl+F5 运行“Profiles.aspx”页。

    说明:

    如果浏览器显示 502 错误或指示页无法显示的错误,可能需要配置浏览器对本地请求跳过代理服务器。有关详细信息,请参见 如何:对于本地 Web 请求不使用代理服务器

  2. 在框中键入邮政编码,然后单击“设置邮政编码”。

    输入的邮政编码即会在 Label 控件中显示。

  3. 关闭浏览器以关闭当前会话。

  4. 重新打开浏览器,然后请求 Profiles.aspx 页。

    先前输入的邮政编码会在 Label 控件中显示。

前面的过程中的最后一步演示了 ASP.NET 存储 PostalCode 值。再次访问此页面时,ASP.NET 可以根据您特有的匿名 ID 读取 PostalCode 值。

定义复杂属性

在本演练前面的“设置和获取 PostalCode 属性”一节中,创建了名为 PostalCode 的简单属性,此属性作为字符串存储。在本节中,您将定义名为 FavoriteURLs 的属性,此属性为集合。ASP.NET 可以存储任何类型的 Profile 属性,但定义 Profile 属性时,您必须提供其他信息。

定义 FavoriteURLs 属性

  1. 打开 Web.config 文件。

  2. 将下面突出显示的元素添加到在本演练前面的“配置配置文件属性”一节中创建的 profile 元素中:

    <anonymousIdentification enabled="true" />
      <profile>
        <properties>
        <add name="PostalCode" 
          type="System.String" 
          allowAnonymous="true" />
        <add name="FavoriteURLs"       type="System.Collections.Specialized.StringCollection"      allowAnonymous="true" />
        </properties>
      </profile>
    

    现在已添加名为 FavoriteURLs 的新 Profile 属性。对于不属于简单类型(如字符串或整数)的 Profile 属性,必须指定完全限定类型。在此处要指定 Profile 属性将是一个持有字符串的集合。

  3. 保存并关闭 Web.config 文件。

设置和获取 FavoriteURLs 属性

使用作为集合的 FavoriteURLs 属性的方法与使用任何上下文中的集合颇为相似。在演练的此部分中,将添加用户可以键入 URL 的 TextBox 控件,从而更新在本演练前面的“设置和获取 PostalCode 属性”一节中创建的 Profiles.aspx 页。用户单击“添加”时,URL 即会添加到 FavoriteURLs 属性。还将在下拉列表框中显示收藏的 URL 的当前列表。

设置和获取 FavoriteURLs 属性

  1. 在“Profiles.aspx”页上,添加以下控件并如下表所述设置其属性。

    控件

    属性设置

    TextBox

    ID = textFavoriteURL

    Button

    ID = AddURL

    Text = 添加 URL

    ListBox

    ID = listFavoriteURLs

  2. 切换到源视图,然后将以下属性添加到“添加 URL”按钮(如果此属性不存在)。

    OnClick="AddURL_Click"
    
  3. 为“添加 URL”创建 Click 处理程序,然后添加下面突出显示的代码。

    Sub AddURL_Click(ByVal sender As Object, _
            ByVal e As System.EventArgs)
        Dim urlString As String = _        Server.HtmlEncode(textFavoriteURL.Text)
        If Profile.FavoriteURLs Is Nothing Then
            Profile.FavoriteURLs = New _
                System.Collections.Specialized.StringCollection
        End If
        Profile.FavoriteURLs.Add(urlString)    DisplayFavoriteURLs()
    End Sub
    
    void AddURL_Click(object sender, System.EventArgs e)
    {    
        String urlString = Server.HtmlEncode(textFavoriteURL.Text);
        if(Profile.FavoriteURLs == null)
        {
            Profile.FavoriteURLs = new 
                System.Collections.Specialized.StringCollection();
        }
        Profile.FavoriteURLs.Add(urlString);    DisplayFavoriteURLs();
    }
    
  4. 在 Page_Load 处理程序中添加下面突出显示的代码行。

    Sub Page_Load(ByVal sender As Object, ByVal e As EventArgs)
        labelPostalCode.Text = Profile.PostalCode
        DisplayFavoriteURLs()
    End Sub
    
    void Page_Load(object sender, System.EventArgs e)
    {
        labelPostalCode.Text = Profile.PostalCode;
        DisplayFavoriteURLs();
    }
    
  5. 添加下面的子例程以更新 ListBox 控件中 URL 的显示。

    Sub DisplayFavoriteURLs()
        listFavoriteURLs.DataSource = Profile.FavoriteURLs
        listFavoriteURLs.DataBind()
    End Sub
    
    void DisplayFavoriteURLs()
    {    
        listFavoriteURLs.DataSource = Profile.FavoriteURLs;
        listFavoriteURLs.DataBind();
    }
    

测试 FavoriteURLs 配置文件属性

现在可以测试 FavoriteURLs 属性。

测试 FavoriteURLs 属性

  1. 若要运行“Profiles.aspx”页,请按 Ctrl+F5。

    ListBox 控件中最初没有任何值。

  2. 在框中键入一个 URL,然后单击“添加”。

    URL 即会添加到 ListBox 控件中。

  3. 重复前面的步骤以添加另一个 URL。

  4. 关闭浏览器。

  5. 重新打开浏览器,然后打开“Profiles.aspx”页。

    请注意,ListBox 控件已经用关闭浏览器前输入的 URL 进行了填充。

登录过程中迁移配置文件属性

如果某个用户首先以匿名用户身份访问网站,然后登录,您可能需要保留用户为匿名身份时建立的属性设置。典型的示例是:在购物网站中,用户可能先以匿名用户身份浏览,并将物品添加到购物车,然后登录以付款。若要在用户登录时保留其值,请将用户从当前匿名用户配置文件迁移到他们作为登录用户(经过身份验证)时的用户配置文件。

在本节中,迁移用户的 PostalCode 设置。必须有一个已经配置为使用用户标识且有登录页面的网站。如果尚未将正在使用的网站配置为支持成员资格,请使用以下过程将其启用。如果网站已经支持成员资格,可以转至下一节。

配置网站以支持成员资格

  1. 在 Visual Studio 中,在“网站”菜单中单击“ASP.NET 配置”。

    出现网站管理工具。

  2. 单击“安全”选项卡。

  3. 单击“安全”,然后在“用户”下单击“选择身份验证类型”。

  4. 选择“通过 Internet”,然后单击“完成”。

    “通过 Internet”选项指定应用程序将使用 Forms 身份验证,意味着用户将使用登录页面登录应用程序。

  5. 在“安全”选项卡的“用户”下,单击“创建用户”,然后创建用户帐户。

    可以使用任何名称和密码,但请确定记住了使用的名称和密码。对于电子邮件地址,请使用自己的邮件地址。(本演练中将不会发送电子邮件。)

  6. 定义用户帐户后,关闭网站管理工具。

  7. 从工具箱的“登录”组中,将 Login 控件和 LoginName 控件拖动到页面上。

    登录时无需使用 LoginName 控件,但此控件有助于查看是否已登录。

创建迁移处理程序

若要将匿名用户的设置迁移到登录用户的设置,必须在用户标识更改时执行迁移。为此,ASP.NET 提供了 MigrateAnonymous 事件;在 MigrateAnonymous 事件的处理程序中,可以传输要保留的设置。

创建迁移处理程序

  1. 在解决方案资源管理器中,右击网站的名称,然后单击“添加新项”。

  2. 在“Visual Studio 已安装的模板”之下单击“全局应用程序类”,然后单击“添加”。

    无需输入名称,因为文件的名称始终为 Global.asax。

  3. 键入以下代码,以便为 MigrateAnonymous 事件创建新的处理程序。

    Sub Profile_MigrateAnonymous(ByVal sender As Object, _
        ByVal e As ProfileMigrateEventArgs)
        If Profile.GetProfile(e.AnonymousID).PostalCode <> "" Then
            Profile.PostalCode = _
                Profile.GetProfile(e.AnonymousID).PostalCode
        End If
    End Sub
    
    void Profile_MigrateAnonymous(Object sender, 
            ProfileMigrateEventArgs e)
    {
        if(Profile.GetProfile(e.AnonymousID).PostalCode != String.Empty)
        {
            Profile.PostalCode = 
                Profile.GetProfile(e.AnonymousID).PostalCode;
        }
    }
    

    此代码获取匿名用户的用户配置文件,并提取 PostalCode 值。然后,它获取新用户标识的配置文件,并为该标识设置等效值。

测试迁移

为了测试迁移,首先以匿名用户身份进行某些设置。然后,登录并查看相关值是否保留。

测试迁移

  1. 打开“Profiles.aspx”页,然后按 Ctrl+F5 运行该页面。

    LoginName 控件不显示任何内容,因为您尚未登录。

  2. 如果页面上没有显示邮政编码,键入新的邮政编码,然后单击“设置邮政编码”。

    当前匿名标识的邮政编码即会在页面上显示。

  3. 使用在本演练前面的“登录过程中迁移配置文件属性”一节中创建的用户名和密码登录。

    LoginName 控件将显示您的用户名。而且以匿名用户身份输入的邮政编码仍然显示,因为此邮政编码设置已经迁移到您的登录用户配置文件。

后续步骤

本演练演示在 Web 应用程序中配置和使用 Profile 属性的基本过程。可以使用 Profile 属性在应用程序中执行多种任务。下表列出了可能要使用 Profile 属性的其他区域:

请参见

概念

ASP.NET 配置文件属性概述

ASP.NET 配置文件提供程序