Asp.net个性化服务《系列01》

 

1.什么是个性化服务

个性化服务是一种技术框架,为用户提供了自定义站点外观、内容、布局、角色管理等功能,如同QQ空间等。

2.个性化服务需要程序员学习哪些方面,才能实现这些功能

个性化服务是一个框架,这个框架包含3个核心功能:个性化用户配置、web部件、成员资格与角色管理。我们就是要着重学习这3个功能。

3.时刻记住

一般情况下只有登录的用户才能使用个性化服务,比如博主对博客板块的添加与删除或对样式进行修改。所以我们在开发的时候不能忘记要有登录/注册模块。匿名用户也可通过程序员的配置来使用。

4.个性化服务包含的三大方面

这三大方面是:

  • 个性化用户配置
  • WEB部件
  • 成员资格与角色管理

若这三大功能自己手动实现,技术难度很大,ASP.NET 2.0提供了一系列控件供我们使用。使开发更加的敏捷迅速。

(1).个性化用户配置

在手工时代需要把个性化信息存储在Session或数据库中(比如主题皮肤、每页显示的条数),存储这些信息是实现个性化服务的基础,但需要编写大量的代码,效率低下。2.0提供的这些都是自动完成的。
个性化用户配置功能的核心是Web.config文件的配置。注意既然是核心也是学习的重点。

(2).Web部件

得益于Web部件,用户才能根据喜好对页面所包含的模块进行调整

(3). 成员资格与角色管理

成员资格:能否进行登录,由成员资格进行决定。
角色管理:登录后能进行什么操作,由角色来管理。

5.详细介绍个性化服务之一《个性化用户配置》

掌握:Profile配置节

掌握:有关API

掌握:SQL Server数据库配置

使用个性化用户配置功能的两个核心步骤是:
<1>在web.config文件中配置 配置节以启动该功能。
<2>使用相关API对用户配置信息进行存储、访问。

配置节声明 学习建议查看MSDN文档中的profile配置节

     
      
	
      
      
       
       ...
      
       
	
      
      
       
       ...
      
       

     
     

配置节位于 配置节之下。重点关注的有enabled属性,inherits属性, 子节点, 子节点。

  • enabled用于启动个性化配置(默认值为true)
  • 子节点(必选元素)用于定义属性
  • 子节点(可选元素)用于定义提供程序
  • Inherits属性值用于指定一个类与 有关

说句题外话,machine.config文件中的配置为全局配置,会应用到服务器下的每一个Web应用程序中,每一个Web应用程序在创建时首先都会从machine.config文件继承配置设置,过后也可以在web应用程序的web.config文件中对machine.config的同名配置进行改写(需要加 清除对父文件的继承),这样会产生覆盖,与父类子类的继承、覆盖的道理类似。不到万不得已不要改写machine.config文件。

以下是C:/WINDOWS/Microsoft.NET/Framework/v2.0.50727/CONFIG/machine.config的部分配置:

     
     
  
      
      

     
     

     
     
  
      
      
    
       
       
      
        
        
    
       
       
  
      
      

      
      
     
     
5.1 测试connectionStrings配置节的继承性

1. 创建新的网站或新的项目

2. 在Default.aspx.cs文件中编写代码

screenshot1

3. 运行后的结果

screenshot2

通过结果可以看到在web.config文件中虽然没有编写 配置节但该配置节却有默认值,这些默认值来自于machine.config文件,继承于machine.config文件中的 配置节。

4. 让我们继续测试,在web.config文件中加入如下配置节

screenshot1

第一个”LocalSqlServer”配置是从machine.config文件中粘贴过来的(为了同名),第二个是随便写的。

5. 运行后的结果

screenshot3

可以看到第一个 配置对父文件产生了覆盖,不会与父文件中同名的“LocalSqlServer”产生冲突。但如果把子文件的“LocalSqlServer”的其他属性的值改一改,就会发生重复定义错误,需要在web.config的 节点前加 节点清除继承性,大家可以动手试一试。

5.2 测试profile配置节的继承性

1. 继续上面的网站,不要在web.config中加任何有关 节点的设置。

2. 在Default.aspx.cs文件中编写获得profile节点属性的代码:

using System;
using System.Configuration;
using System.Web.Configuration;
public partial class _Default : System.Web.UI.Page {
    protected void Page_Load(object sender, EventArgs e) {
        //测试ConnectionStrings配置节
        ConnectionStringSettingsCollection col = ConfigurationManager.ConnectionStrings;
        for (int i = 0; i < col.Count; i++) {
            Response.Write(" " +
                            col[i].Name + " " +
                            col[i].ConnectionString + " " +
                            col[i].ProviderName + "
"); } //测试Profile配置节 // Get the Web application configuration. Configuration configuration = WebConfigurationManager.OpenWebConfiguration("/"); // Get the section. ProfileSection profileSection = (ProfileSection)configuration.GetSection("system.web/profile"); //ProfileSection profileSection = new ProfileSection(); Response.Write("默认提供程序defaultProvider属性=: " + profileSection.DefaultProvider + "
"
); Response.Write("profile是否启动enabled属性=:" + profileSection.Enabled + "
"
); Response.Write("inherits属性=: " + profileSection.Inherits + "
"
); Response.Write("automaticSaveEnabled属性=: " + profileSection.AutomaticSaveEnabled + "
"
); Response.Write("properties子配置节:
  • " ); foreach ( ProfilePropertySettings temp in profileSection . PropertySettings ) { Response . Write ( "
    • 属性名name=: " + temp.Name + " 属性类型type=: " + temp.Type + " 序列化格式serializeAs=:" + temp.SerializeAs.ToString() + "
    • "
    ); } Response . Write ( "
"
); Response.Write("providers子配置节:
  • " ); foreach ( ProviderSettings temp in profileSection . Providers ) { Response . Write ( "
    • name=" + temp.Name + " type=" + temp.Type + "
    • "
    ); } Response . Write ( "
"
); } }

 

3. 运行结果

screenshot4

这些默认值继承于machine.config但有的是系统自动生成。

这些默认值整理如下:

defaultProvider="AspNetSqlProfileProvider"

inherits="ProfileCommon"

automaticSaveEnabled="true">

type="System.Web.Profile.SqlProfileProvider"

connectionStringName="LocalSqlServer"

applicationName="/"

commandTimeout="30"

description="" />

inherits="ProfileCommon"中的ProfileCommon是一个在程序运行时动态生成的类继承于ProfileBase类,在这仅是一个属性值的示意,该类和 子节点的配置有关。

示例01 匿名用户个性化

clip_image002    clip_image002[5]

以上是程序运行后的两张截图,当匿名用户首次登录时,显示左图。当用户输入完信息提交后,再次访问如右图,无论是刷新还是重新启动服务器,再次访问都是右图。匿名用户的标识借助于Cookie功能,存储于客户端的cookie中,匿名用户的数据存储于服务器的数据库中。每一个匿名用户在访问页面时会在用户的cookie中存放一个“令牌”,当用户输入完数据提交后这些数据和“令牌”存储于数据库中。当再次访问时拿出“令牌”就可以看到以前的数据,这些功能都是.net自动完成的。我们要做的仅仅是配置和简单的编码。

1. 配置数据库(示例01第一步)

这些数据存储于.net自带的数据库aspnetdb中。首先运行数据库创建程序:C:/WINDOWS/Microsoft.NET/Framework/v2.0.50727/ aspnet_regsql.exe

clip_image001

clip_image002[7]

clip_image002[9]
数据库: <默认> 是让我们输入数据库的名字,默认数据库的名字是aspnetdb,最好采用默认。

clip_image002[11]

配置完成后可以看到我们数据库服务器上多了一个数据库:aspnetdb

clip_image002[13]

数据库现在创建好了,可以看看aspnet_profile表中有什么数据。对了,也可以在cmd中通过命令创建数据库,好处是可以要部分功能,也就是说库中的表不会有这么多。

2. 创建项目并编写default.aspx页面(示例01第二步)

项目结构图:

screenshot5

Default.aspx文件源代码:

<%@ Page Language="C#" AutoEventWireup="true"  CodeFile="Default.aspx.cs" Inherits="_Default" %>

      
      DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title>匿名用户个性化
       
       title>
    <link href="css/style.css" rel="stylesheet" type="text/css" /> 

        
        head>
<body>
    <form id="form1" runat="server">
    <div>
    <fieldset class="area">
        <legend class="mainTitle">匿名用户个性化
         
         legend>
        <br />
        <table border="0" cellpadding="2" cellspacing="2" >
            <tr><td class="head" colspan="2"> 
          
          td> 
           tr> <tr> <td> 上次提交: 
            td> <td> <asp:TextBox ID="TextBox1" runat="server" Enabled="False"> 
             asp:TextBox> 
              td> 
               tr> <tr> <td> 用户姓名: 
                td> <td> <asp:TextBox ID="TextBox2" runat="server"> 
                 asp:TextBox> 
                  td> 
                   tr> <tr> <td> 所在国家: 
                    td> <td> <asp:TextBox ID="TextBox3" runat="server"> 
                     asp:TextBox> 
                      td> 
                       tr> <tr> <td> 邮政编码: 
                        td> <td> <asp:TextBox ID="TextBox4" runat="server"> 
                         asp:TextBox> 
                          td> 
                           tr> <tr> <td align="center" colspan="2"> <asp:Button ID="Button1" runat="server" Text=" 提交 " onclick="Button1_Click" /> 
                            td> 
                             tr> <tr><td class="head" colspan="2">  
                              td> 
                               tr> 
                                table> 
                                 fieldset> 
                                  div> 
                                   form> 
                                    body> 
                                     html>

 

css/style.css

body
{
    font-size: 9pt;
    font-family: Arial,宋体;
}
fieldset table
{
    border: solid 1px #000;
    width: 100%;
}
input
{
    border: solid 1px #000;
}
.area
{
    width: 300px;
}
.mainTitle
{
    font-size: 12pt;
    font-weight: bold;
}
td.head
{
    font-size: 10pt;
    font-weight: bold;
    color: #fff;
    background-color: #000;
}

 

3.  配置web.config文件(示例01第三步)

要配置两个节点:

(1) 用于定义项目所用到的数据库

(2) 个性化设置

screenshot6

第29行配置数据库连接字符串由于和父文件重名,要 。

第34行为匿名用户启动用户标识,默认情况下只为注册用户启动,不为匿名用户启动。

第35行defaultProvider=”AspNetSqlProfileProvider”指默认提供程序由name的值为”AspNetSqlProfileProvider”的配置节指定,与38行对应。

第38行定义个性化提供程序,提供程序是类库中的”System.Web.Profile.SqlProfileProvider”类,该类操作数据库完成数据库信息存取,属于数据访问层,操作哪个数据库由connectionStringName属性值指定。多个web应用程序可以操作同一个数据库(aspnetdb),为了避免信息冲突使用applicationName属性值来指定,“/”指代当前web应用根目录。此 节点可以省略。

第43行是最为重要的,根据页面的表单在这定义个4个属性,这4个属性就是要保存到数据库中的数据。分别是”UserName”、”LastSubmitTime”、”City”、”ZipCode”,并且把”City”,”ZipCode”放到了组中,组的作用非常简单就是为了避免属性过多时的命名冲突。allowAnonymous=”true”是允许匿名访问与 配合使用,缺一不可,这样才会为匿名用户存储信息。Type用于指定该属性的数据类型,默认值为字符串。在程序中可以通过Profile对象操作这些属性,比如Profile.UserName或Profile.Address.City。
关于Profile对象的解释请继续往下看。

4. 好了现在进行最后一步,编写代码(示例01第四步)

screenshot7

当用户首次访问页面时,调用display()方法,重点关注Profile对象,该对象是当前页面类的成员对象,所属的类是ProfileCommon,还记得吗ProfileCommon类是 节点的inherits属性的默认值,该类是程序运行时.net动态生成的类,用于获取或设置 配置的属性值。

比如Profile.UserName获取或设置的是 的属性值。

Profile.LastSubmitTime获取或设置的是 的属性值,Profile.LastSubmitTime的数据类型由配置的Type指定为”System.DateTime”类型,如果不写Type属性默认为”String”类型。

Profile.Address.City访问的是Address组中的City属性。

当用户点击按钮后,将页面收集到的数据赋值给Profile的各个属性,profile对象自身负责和数据库的交互。

当再次访问时,通过Profile对象可以把这些值取出来如代码的11~14行。如果我们在web.config文件中加入一个新属性,可以通过Profile对象智能感知出来(也就是Profile对象点出来,不过要先编译)。

最后看一看我们数据库中存的是什么,以此结束第一个示例。

screenshot8

每一个用户在aspnet_Profile表中只会占据一行,UserID用于存储用户的唯一标识,PropertyNames用于存储 配置节配置的属性名称,PropertyValuesString用于存储属性的值,PropertyValuesBinary用于存储采用二进制序列化后的用户配置属性的值。最后一个存储上次数据库更新日期。可以看到配置文件中的属性名存储在PropertyNames数据列中,而用户提交的值在PropertyValuesBinary列中。

不经常写博客但每一篇都精益求精,下一篇《个性化系列02》 【明德兄】

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值