首先声明运行环境是:vs2008sp1+SQLServer2005Expression 1.什么是个性化服务 个性化服务是Asp.net自带的一种技术框架,为用户提供了自定义站点外观、内容、布局、角色管理等功能,如同QQ空间等。 2.个性化服务需要程序员学习哪些方面,才能实现这些功能 个性化服务是一个框架,这个框架包含3个核心功能:个性化用户配置、web部件、成员资格与角色管理。我们就是要着重学习这3个功能。 3.时刻记住 一般情况下只有登录的用户才能使用个性化服务,比如博主对博客板块的添加、删除或对样式进行修改,所以我们在开发的时候一般情况下会有登录、注册模块。但这不是绝对的匿名用户也可以使用个性化功能,比如google的个性化搜索主页,如果为匿名用户启动个性化功能,需要对web.config文件进行相关配置。 4.个性化服务包含的三大方面
这三大功能如果自己完全从零开始编写不仅技术难度大,而且后期的维护也是一件麻烦事。ASP.NET 2.0提供了一系列与个性化有关的控件供我们使用,使开发更加的敏捷迅速。 (1).个性化用户配置 在手工时代需要把个性化信息存储在Session或数据库中(比如主题皮肤、每页显示的条数),存储这些信息是实现个性化服务的基础,但需要编写大量的代码,效率低下。2.0提供的这些都是自动完成的。 个性化用户配置功能的核心是Web.config文件中的Profile节的配置。注意既然是核心也是学习的重点。 (2).Web部件 得益于Web部件,用户才能根据喜好对页面所包含的模块进行调整 (3). 成员资格与角色管理 成员资格:能否进行登录,由成员资格进行决定。 角色管理:登录后能进行什么操作,由角色来管理。 5.详细介绍个性化服务之一《个性化用户配置》 掌握:Profile配置节 掌握:有关API 掌握:SQL Server数据库配置 使用个性化用户配置功能的两个核心步骤是: <1>在web.config文件中配置<profile>节以启动该功能。 <2>使用相关API对用户配置信息进行存储、访问。 <profile>配置节声明 学习建议查看MSDN文档中的profile配置节
<profile enabled="true|false"
inherits="fully qualified type reference"
automaticSaveEnabled="true|false"
defaultProvider="provider name">
<properties>...</properties>
<providers>...</providers>
</profile>
|
<profile>配置节位于<system.web>配置节之下,部分解释采用了MSDN中的解释:
- enabled:可选属性用于设置profile个性化功能是否启动,该属性的默认值为true
- inherits:可选属性在MSDN上是这样说的:“可选的String属性,包含从ProfileBase抽象类派生的自定义类型的类型引用。ASP.NET动态地生成一个从该类型继承的ProfileCommon类,并将该类放在当前HttpContext的Profile属性中。”该属性是可选的,属性值是一个字符串。该字符串是一个从ProfileBase类继承的子类名。大部分情况下该属性不用配置,也不用写在Profile属性中,会在运行时动态生一个类,这个类的类名是ProfileCommon,父类是ProfileBase。我们所要保存的个性化信息都会动态的注入到该类中,成为该类的实例成员。该类与<properties>属性节有关。在代码中通过当前页面的Profile属性访问该类的实例。
- automaticSqveEnabled:可选属性指定用户配置文件是否在 ASP.NET 页执行结束时自动保存。如果为 true,则用户配置文件在 ASP.NET 页执行结束时自动保存。默认值为true。
- defaultProvider:可选的String属性。指定默认配置文件提供程序的名称。默认值为AspNetSqlProfileProvider。
- <properies>子节点(必选元素)用于定义需要保存到数据库中的个性化信息,在<properties>属性节中定义的每一个子节点都会成为ProfileCommon类的实例的成员变量。
- <providers>子节点(可选元素)用于定义个性化提供程序,提供程序起到了持久层的作用, 用于和具体的数据库进行交互,将ProfileCommon类(起到了实体类的作用)的实例写到数据库或将数据库的信息读到实体类中。
说句题外话,machine.config文件中的配置为全局配置,会应用到服务器(IIS)下的每一个Web应用程序中,每一个Web应用程序在创建时首先都会从machine.config文件继承配置设置,过后也可以在具体的web应用程序的web.config文件中对machine.config的同名配置进行改写(需要加<clear/>清除对父文件的继承),这样会产生覆盖,与父类子类的继承、覆盖的道理类似。不到万不得已不要改写machine.config文件,毕竟会影响到服务器下的每一个网站。
以下是C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\CONFIG\machine.config的部分配置:
<connectionStrings>
<add name="LocalSqlServer"
connectionString="data source=.\SQLEXPRESS;Integrated Security=SSPI;AttachDBFilename=|DataDirectory|aspnetdb.mdf;User Instance=true"
providerName="System.Data.SqlClient"/>
</connectionStrings>
<system.web>
<profile>
<providers>
<add name="AspNetSqlProfileProvider"
connectionStringName="LocalSqlServer"
applicationame="/"
type="System.Web.Profile.SqlProfileProvider, System.Web,Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"/>
</providers>
</profile>
<system.web>
|
connectionStrings用于定义数据库连接字符串的集合
profile用于定义个性化配置
5.1 测试connectionStrings配置节的继承性
1. 创建新的网站或新的项目
2. 在Default.aspx.cs文件中编写代码
3. 运行后的结果
通过结果可以看到在该项目的web.config文件中虽然没有编写<connectionStrings>配置节但该配置节却有默认值,这些默认值来自于machine.config文件,继承于machine.config文件中的<connectionstrings>配置节。
4. 让我们继续测试,在web.config文件中加入如下配置节
第一个”LocalSqlServer”配置是从machine.config文件中粘贴过来的(为了同名),第二个是随便写的。
5. 运行后的结果
可以看到第一个<add>配置对父文件产生了覆盖,不会与父文件中同名的“LocalSqlServer”产生冲突。但如果把子文件“LocalSqlServer”除name属性的其他属性值改一改,就会发生重复定义错误,需要在web.config<add>节点前加<clear/>节点清除继承性,大家可以动手试一试。
5.2 测试profile配置节的继承性
1. 继续上面的网站,不要在web.config中加任何有关<profile>节点的设置。
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("<font color=red> " +
col[i].Name + "</font><font color=blue> " +
col[i].ConnectionString + "</font><font color=black> " +
col[i].ProviderName + "</font><br/>");
}
//测试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 + "<br/>");
Response.Write("profile是否启动enabled属性=:" + profileSection.Enabled + "<br/>");
Response.Write("inherits属性=: " + profileSection.Inherits + "<br/>");
Response.Write("automaticSaveEnabled属性=: " + profileSection.AutomaticSaveEnabled + "<br/>");
Response.Write("properties子配置节:<ul>");
foreach (ProfilePropertySettings temp in profileSection.PropertySettings) {
Response.Write("<li>属性名name=: " + temp.Name +
" 属性类型type=: " + temp.Type +
" 序列化格式serializeAs=:" + temp.SerializeAs.ToString() +
"</li>");
}
Response.Write("</ul>");
Response.Write("providers子配置节:<ul>");
foreach (ProviderSettings temp in profileSection.Providers) {
Response.Write("<li>name=" + temp.Name + " type=" + temp.Type + " </li>");
}
Response.Write("</ul>");
}
}
|
3. 运行结果
这些默认值继承于machine.config。
这些默认值整理如下:
<profile enabled="true"
defaultProvider="AspNetSqlProfileProvider"
inherits="ProfileCommon"
automaticSaveEnabled="true">
<providers>
<clear/>
<add name="AspNetSqlProfileProvider"
type="System.Web.Profile.SqlProfileProvider"
connectionStringName="LocalSqlServer"
applicationName="/"
commandTimeout="30"
description="" />
</providers>
</profile>
|
inherits="ProfileCommon"中的ProfileCommon是一个在程序运行时动态生成的类继承于ProfileBase类,在这仅是一个属性默认值的示意,该类和<properties>子节点的配置有关。
示例01 匿名用户个性化
以上是程序运行后的两张截图,当匿名用户首次登录时,显示左图。当用户输入完信息提交后,再次访问如右图,无论是刷新还是重新启动服务器,再次访问都是右图。匿名用户的标识借助于Cookie功能,存储于客户端的cookie中,匿名用户的数据存储于服务器的数据库中。每一个匿名用户在访问页面时会在用户的cookie中存放一个“令牌”,当用户输入完数据提交后这些数据和“令牌”存储于数据库中。当再次访问时拿出“令牌”就可以看到以前的数据,这些功能都是.net自动完成的。我们要做的仅仅是配置和简单的编码。
1. 配置数据库(示例01第一步)
这些数据存储于.net自带的数据库aspnetdb中。首先运行数据库创建程序:C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\ aspnet_regsql.exe
数据库:<默认> 是让我们输入数据库的名字,默认数据库的名字是aspnetdb,最好采用默认。
配置完成后可以看到我们数据库服务器上多了一个数据库:aspnetdb
数据库现在创建好了,可以看看aspnet_profile表中有什么数据。对了,也可以在cmd中通过命令创建数据库,好处是可以要部分功能,也就是说库中的表不会有这么多。
2. 创建项目并编写default.aspx页面(示例01第二步)
项目结构图:
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;
|
|
请发表评论