12 个性化
12.1 为访客提供个性化服务
12.2 ASP.NET中的个性化
12.2.1 用户配置文件
用户配置文件时ASP.NET个性化服务的核心。
12.2.2 个性化提供程序
PersonalizationProvider抽象类
12.3 个性化功能的使用
个性化功能的使用非常简单。我们在web.config中定义个性化属性。ASP.NET会自动生成一个类,以方便开发者管理个性化设置。
12.3.1 在web.config中定义配置文件
假定我们设计网站时决定跟踪用户以下信息
-- 登录次数(整型)
-- 用户名(字符串)
-- 性别(布尔值)
-- 生日(日期)
那么以上属性可以这样在web.config中定义:
<system.web> <profile automaticSaveEnabled=”True”> <add name=”NumVisits” type=”System.Int32”/> <add name=”UserName” type=”System.String”/> <add name=”Gender” type=”System.Boolean”/> <add name=”Birthday” type=”System.DateTime”/> </profile> </system.web>
在web.config文件中定义完属性后,便可以通过当前HttpContext的Profile属性来配置文件信息。
12.3.2 配置文件信息的使用
ProfileBase能够表示web.config中定义的配置文件信息。可以像下面这样使用GetPropertyValue和SetPropertyValue方法来访问配置文件属性;
Protected void Page_Load(object sender,EventArge e) { ProfileBase profile = HttpContext.Current.Profile; String name = (string)profile.GetPropertyValue(“Name”); If(name!=null) { Response.Write(“Hello ”+ name); } }
12.3.3 配置文件变更的保存
ProfileBase profile = HttpContext.Current.Profile; Profile.SetPropertyValue(“Name”,this.TextBoxName.Text); profile.Save();
12.3.4 配置文件与用户
用户和配置文件信息时通过用户标识来关联的。默认情况下,ASP.NET会使用HttpContext中的User.Identity.Name来作为数据存储的键。业正因为此,配置文件一般只提供给通过身份验证的用户使用。
不过Asp.NET也支持匿名配置文件。这也是web.config中配置的。匿名配置文件跟踪机制默认会采用Cookie。然而,可以使ASP.NET采用重整的URL。重整的URL是一种包含某种键的URL,这个键能够标识客户端,并随请求回发至服务器。
使用配置文件:
1. 创建ASP.NET Web应用程序 MakeItPersonal
2. 为使个性化功能正常工作,Visual Studio会创建一个本地数据库。
3. 更新web.config文件,在<profile>元素中添加配置文件属性。
<profile> <providers> <clear/> <add name="AspNetSqlProfileProvider" type="System.Web.Profile.SqlProfileProvider" connectionStringName="ApplicationServices" applicationName="/"/> </providers> <properties> <add name="Theme" type="System.String"/> <add name="Name" type="System.String"/> <add name="Birthdate" type="System.DateTime"/> <group name="Address"> <add name="StreetAddress" type="System.String"/> <add name="City" type="System.String"/> <add name="State" type="System.String"/> <add name="ZipCode" type="System.String"/> </group> </properties> </profile> <!--启用匿名个性化跟踪功能--> <anonymousIdentification enabled="true" cookieName=".ASPXANONYMOUSUSER" cookieTimeout="120000" cookiePath="/" cookieRequireSSL="false" cookieSlidingExpiration="true" /> </system.web>
protected void Page_Load(object sender, EventArgs e) { if (!this.IsPostBack) { ProfileBase profile = HttpContext.Current.Profile; //如果存在配置信息则将它们显示出来 string theme = (string)profile.GetPropertyValue("Theme"); this.tbName.Text = (string)profile.GetPropertyValue("Name"); this.tbAddress.Text = (string)profile.GetPropertyValue("Address.StreetAddress"); this.tbCity.Text = (string)profile.GetPropertyValue("Address.City"); this.tbState.Text = (string)profile.GetPropertyValue("Address.State"); this.tbZip.Text = (string)profile.GetPropertyValue("Address.ZipCode"); this.DropDownList1.SelectedValue = (string)profile.GetPropertyValue("Theme"); this.Calendar1.SelectedDate = (DateTime)profile.GetPropertyValue("Birthdate"); } } protected void btnSub_Click(object sender, EventArgs e) { if (this.User.Identity.IsAuthenticated) { ProfileBase profile = HttpContext.Current.Profile; profile.SetPropertyValue("Theme", "SeeingRed"); profile.SetPropertyValue("Name", this.tbName.Text); profile.SetPropertyValue("Address.StreetAddress", this.tbAddress.Text); profile.SetPropertyValue("Address.City", this.tbCity.Text); profile.SetPropertyValue("Address.State", this.tbState.Text); profile.SetPropertyValue("Address.ZipCode", this.tbZip.Text); profile.SetPropertyValue("Theme", this.DropDownList1.SelectedValue); profile.SetPropertyValue("Birthdate", this.Calendar1.SelectedDate); profile.Save();//保存配置信息 } }
12.4 快速参考
定义个性化配置文件的设置 |
在web.config中通过<profile>来定义用于建立配置文件架构的名称和类型对 |
访问配置文件的属性 |
通过当前的HttpContext来获取配置文件对象,并使用GetPropertyValue和SetPropertyValue方法访问 |
通过Cookie跟踪匿名配置文件 |
在web.config中启用anomymousIdentification,并为必要的配置文件属性添加allowAnonymous特性 |
13. Web部件
13.1 “Web部件”简史
13.1 “Web部件”的优点
“Web部件”控件可以用来实现门户网站。工作流和协作管理如今已成为网站主要应用方向之一。
ASP.NET”Web部件”的开发主要向以下3种场景:
n 开发“Web部件”控件
n 构建采用“Web部件”控件的常规页面
n 实现门户网站中的“Web部件”页面和“Web部件”
13.3 “Web部件”控件的开发
所有“Web部件”控件都可以看做是现有ASP.NET服务器控件的一个超集。能够在特定环境中以编程方式控制“Web部件”控件,开发者还可以通过从System.Web.UI.WebControls.WebParts.WebPart类派生来创建自定义的“Web部件”控件。
13.3.1 “Web部件”页面的开发
一般的网页就能够使用“Web部件”。Visual Studio支持创建包含WebPart控件的页面。
开发WebPart页面需要为页面添加WebPartManager和若干区域,并为这些区域添加WebPart控件
13.3.2 “Web部件”应用程序的开发
最后,我们可以通过WebPart控件来开发完整的应用程序。例如,假设要构建一个门户。如果使用WebPart控件,则可以实现可自定义的个性化页面。“Web部件”还适合构建常用的应用程序(如共享记录或文档的应用程序),并可以将其打包发布,然后批量部署到其他公司的网站上。
13.4 “Web部件”的架构
“Web部件”的架构承担着多方面任务。“Web部件”的职责是充当更高层次的UI元素,所以功能组件被分解为页面管理和区域管理。不同WebPart控件需要协调一致。此外,页面中的每个功能区域通常需要作为一组控件来处理(如为了管理布局)。
13.4.1 WebPartManager与WebPartZone
“Web部件”由区域管理,而区域由WebPartManager管理。只要页面使用了WebPart,不论多少,就都要添加WebPartManager。WebPartManager负责管理和协调区域和区域中的控件。WebPartZone能够管理自身控件集合中的UI元素。
在区域中,ZoneTemplate 用于容纳“Web部件”。如果ZoneTemplate中有常规的ASP.NET控件,那么ASP.NET会按WebPart的形式来包装它。
13.4.2 内建的区域
“Web部件”区域用于管理一组控件的布局。ASP.NET中内建了以下4种区域:
n WebPartZone 包含了管理区域中服务器端控件的基本功能。这种区域能够容纳的服务器端控件和WebPart控件。常规的控件在运行时会由GenericWebPart控件包装,以使它们具有WebPart的行为。
n CatalogZone这种区域(目录区域)用于承载CatalogPart控件。“目录”一般用于管理页面中部件的可见性。CatalogZone控件能够根据显示模式来显示和隐藏其内容。之所以称其为“目录”,是因为它充当了最终用户可以从中选择的控件目录。
n EditorZone 该控件允许最终用户根据个人偏好修改和个性化网页。对网站进行个性化包括设置个人信息(如果生日,性别特定的称呼,网站的访问次数等),颜色搭配和布局….EditorZone旨在实现这方面的特性,它也能够保存和加载相关的设置,以便用户在下次登录时能够继续使用。
n ConnectionZone “Web部件”之间往往需要动态连接和通讯。ConnectionZone正是为此而设立的。
13.4.2 内建的”Web部件”
n DeclarativeCatalogPart 在构建WebPart页面时,可以动态调添加或声明部件。
n 最终用户可能会通过打开和关闭控件来自定义网站。
n PageCatalogPart 最终用户可能会通过打开和关闭控件来自定义网站。
n ImportCatalogPart 使用ImportCatalogPart,用户可以从xml数据导入“Web部件”的描述。
n AppearanceEditorPart 该控件用于编辑与某个WebPart或GenericWebPart关联的外观属性。
n BehaviorEditorPart 该控件实现了对WebPart或GenericWebPart行为的编辑
n LayoutEditorPart 该控件用于编辑与某个WebPart或GenericWebPart关联的布局属性。
n PropertyGridEditorPart 该控件支持用户编辑WebPart的自定义属性(而其他EditorPart控件只支持对WebPart类现有属性进行编辑)
使用“Web部件”:
使用网站支持“Web部件” |
针对应用程序的数据库运行aspnet_regsql,以确保启用了配置文件和角色 |
使用页面支持WebPart控件 |
为页面添加WebPartManager |
使用“Web部件”页面支持编辑功能 |
为页面添加EdiorZone |
添加一个能使服务器端控件接受“Web部件”架构管理的区域 |
为页面添加WebPartZone |
允许用户动态地从控件集合中添加控件 |
为页面添加CatalogZone,在“编辑模板”模式下添加希望在目录中出现的控件 |
创建“Web部件” |
从System.Web.UI.WebControls.WebParts.WebPart类派生子类,然后选择以下任意一种方法来呈现内容: n 在Web部件的Reader方法中呈现HTML n 在ASP.NET控件,然后将其添加到“WEB部件”的Controls集合中,以实现自动呈现 |
状态管理与缓存
14. 会话状态
14.1 何为会话状态
14.2 ASP.NET与会话状态
14.3会话状态简介
实践会话状态:
1. 新建ASP.NET空Web应用程序 SeesionState.
2. 添加一个Web窗体 将其命名为Default.aspx。在这个页面中添加一个文本框,以便输入要存储在会话状态的值。为这个文本框添加一个标签。
5. 运行这个页面。在文本框中键入一些文本,然后单击“添加到会话状态”。会发现成员变量不能保存数据。页面对象的生命周期十分短暂。只在请求的处理期间有效,随后便会被销毁,成员变量在请求处理完毕后也会立即清除。我们提交后得到的新页面是一个新对象,成员变量也会重新初始化。
6. 用会话状态可以解决这个问题。编写代码将字符串存储在会话状态中。
7. 运行结果 数据得到保存。
14.4 会话状态与复杂的数据类型
使用ADO.NET对象,数据绑定控件和会话状态:
14.5 会话状态与配置
1. 完全禁用
2. 在进程中存储会话状态
3. 在状态服务器中存储会话状态
4. 在数据库中存储会话状态
14.5.1 禁用会话状态
我们可以通过IIS的ASP.NET会话状态配置工具在web.config文件中配置
14.5.2 在进程中存储会话状态
14.5.3 在状态服务器中存储会话状态
14.5.4 在数据库中存储会话状态
14.6 会话状态的跟踪
14.6.1 通过Cookie跟踪会话状态
14.6.2 通过URL跟踪会话状态
14.6.3 自动检测
14.6.4 使用设备配置文件
14.6.5 会话状态超时
14.7 会话的其他设置
14.8 Wizard控件--会话状态的一种替代方案
14.8 快速参考
访问当前客户端的会话状态 |
使用Page.Session属性或当前上下文的HttpContext.Session属性 |
访问当前客户端会话状态中的值 |
会话状态是一种键/值对集合。可以通过存储数据时使用的键(字符串)来访问相应的数据 |
在进程中存储会话状态 |
在web.confgi中编辑seessionState节点特性。将mode设置为Inproc |
在状态服务器中存储会话状态 |
在web.config中编辑sessionState节的特性。将mode设置为StateServer, 并设置stateConnectionString |
在SQL Server中存储会话状态 |
在web.config中编辑sessionState节的特性。将mode设置为SQLServer, 并设置salConnectionString |
禁用会话状态 |
在web.config中编辑sessionState节的特性。将mode设置为Off |
使用Cookie来跟踪会话状态 |
在Web.config中编辑sessionState节的特性。将cookieless设置为false(默认值) |
使用URL来跟踪会话状态 |
在web.config中编辑sessionState节的特性。将cookieless设置为true |
设置会话状态超时 |
在web.config中编辑sessionState节的特性。将timeout设置为超时树(以分钟为单位) |