15. 应用程序数据的缓存
15.1 前期准备
创建一个利用缓存数据的应用程序:
15.2 数据缓存的使用
DataTable dt = null;
Trace.Warn("Page_Load", "looking in cache");
dt = (DataTable)Cache["InventoryDataTable"];
Trace.Warn("Page_Load", "done looking in cache");
if (dt == null) //判D断?是º?否¤?使º1用®?缓o存ä?数ºy据Y
{
Trace.Warn("Page_Load", "Performing DB lookup");
dt = new DataTable();
string strConnection = @" Data Source=.;AttachDbFilename='D:\Workspace\Visual Studio 2010\培¨¤训¦Ì任¨?务?\2012-01 迭̨¹代䨲2\胡¨²灿¨®业°¦Ì\X\15.应®|用®?程¨¬序¨°数ºy据Y的Ì?缓o存ä?\UseDataCaching\UseDataCaching\App_Data\ASPNETStepByStep4.mdf';Integrated Security=True";
// string strConnection =
// @"Data Source=
// .\SQLEXPRESS;
// AttachDbFilename=|DataDirectory|\ASPNETStepByStep4.mdf;
// Integrated Security=True;User Instance=True";
DbProviderFactory f =
DbProviderFactories.GetFactory("System.Data.SqlClient");
using (DbConnection connection = f.CreateConnection())
{
connection.ConnectionString = strConnection;
connection.Open();
DbCommand command = f.CreateCommand();
command.CommandText = "Select * from DotNetReferences";
command.Connection = connection;
IDataReader reader = command.ExecuteReader();
dt.Load(reader);
reader.Close();
connection.Close();
Cache["InventoryDataTable"] = dt;
Trace.Warn("Page_Load", "Done performing DB lookup");
}
}
return dt;
15.3 缓存的影响
通过GetInventory方法中添加Trace语句,可以跟踪页面看到缓存数据后的效果。
UseDataCaching 应用程序页面的Trace属性默认是被禁用的,但可以启用应用程序级的跟踪。为此设置如下
<configuration>
<system.web>
<trace enabled="true"/>
<compilation debug="true" targetFramework="4.0" />
</system.web>
</configuration>
15.4 缓存的管理
Cache提供了一个带参的重载方法Insert
n 设置绝对过期时间
n 设置可调过期时间
n 设置缓存项的依赖项(如数据库、文件和目录依赖项,甚至缓存项之间的依赖项)
n 管理缓存项的相对失效优先级
n 设置缓存项被移除时调用的回调方法
Cache的Insert方法包含4该重载
|
Insert(String,Object) |
该方法与索引器的设置方法等阶,该方法仅通过一个参数提供的键将Cache中的对象替换 |
|
Insert(String,Object,CacheDependency) |
该方法用于在Cache中插入对象并将其与一个依赖项关联 |
|
Insert(String,Object,CacheDependency,DateTime,TimeSpan) |
该方法用于在Cache中插入对象并将其与一个依赖项和过期策略关联 |
|
Insert(String,Object,CacheDepenDency,DataTime,TimeSpan,CacheItemPriority,CacheItemRemovedCallback) |
该方法用于在Cache中插入对象并将其与一个依赖项和过期策略关联。还可以通过该方法将缓存项与一个回调委托关联,以便在缓存项被移除后通知应用程序 |
15.4.1 内存中的DataSet
/// <summary>
/// Summary description for QuotesCollection
/// </summary>
public class QuotesCollection : DataTable
{
public QuotesCollection()
{
//
// TODO: Add constructor logic here
//
}
public void Synthesize()
{
this.TableName = "Quotations";
DataRow dr;
Columns.Add(new DataColumn("Quote", typeof(string)));
Columns.Add(new DataColumn("OriginatorLastName", typeof(string)));
Columns.Add(new DataColumn("OriginatorFirstName", typeof(string)));
dr = this.NewRow();
dr[0] = "Imagination is more important than knowledge.";
dr[1] = "Einstein";
dr[2] = "Albert";
Rows.Add(dr);
…………………..
15.4.2 缓存过期
设置缓存绝对过期:
QuotesCollection quotesCollection;
DateTime dtCurrent = DateTime.Now;
Trace.Warn("Page_Load",
"Testing cache: " + dtCurrent.ToString());
quotesCollection =
(QuotesCollection)Cache["QuotesCollection"];
if (quotesCollection == null)//检¨¬查¨¦缓o存ä?中D是º?否¤?存ä?在¨²QuotesColleciton对?象¨®的Ì?实º¦Ì例¤y
{
quotesCollection = new QuotesCollection();
quotesCollection.Synthesize();
TimeSpan tsExpires = new TimeSpan(0, 0, 15);
dtCurrent = DateTime.Now;
Trace.Warn("Page_Load",
"Caching at: " + dtCurrent.ToString());
Trace.Warn("Page_Load",
"This entry will expire in: " +
tsExpires.ToString());
Cache.Insert("QuotesCollection",
quotesCollection,
null,
DateTime.MaxValue,
tsExpires);
}
15.4.3 缓存依赖项
设置缓存依赖项:
15.4.4 SQL Server依赖项
15.4.5 缓存项的清除
ASP.NET支持通过以下3种方式移除缓存项:
n 显示地调用Cache.Remove
n 由于内存占用而移除优先级较低的缓存项
n 移除过期的缓存项
Insert方法的重载方法之一 接受一个回调委托参数。ASP.NET能够通过这个委托来通知缓存项已经被移除。为接收通知,只需要实现一个与其签名一致的(回调)方法,用委托将其包装,并将这个委托传入Insert方法。当缓存项被移除后,ASP.NET会调用这个回调方法。
实现移除回调:
15.5 快速参考
|
访问数据缓存 |
数据缓存可以通过页面的Cache属性和当前HttpContext的Cache属性访问 |
|
在缓存中插入数据 |
通过索引符号向缓存插入对象或值 |
|
在缓存中插入带依赖的数据 |
创建CacheDependency对象,通过Cache.Insert方法重载来一并添加缓存项到这个对象 |
|
在缓存中插入带过期策略的数据 |
创建DateTime对象,通过Cache.Insert方法重载来添加缓存项到这个对象 |
|
删除缓存项 |
调用Cache.Remove方法 |
|
在缓存项被移除后获得通知 |
在缓存添加时传入回调委托 |
16. 输出缓存
16.1 页面内容的缓存
Page 指令的Trace特性
Page指令后面添加OutputCache指令,并至少添加两个特性 Duration 和 VaryByParam。Duration特性用于指定内容被缓存的时长。VaryByParam特性指定是否缓存页面多个版本,这里设none
<%@ Page Language="C#" Trace="false" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="OutputCaching.Default" %>
<%@OutputCache Duration="15" VaryByParam="none" %>
protected void Page_Load(object sender, EventArgs e)
{
//Thread.Sleep(10000);
Response.Write("This page was generated and cached at: "+ DateTime.Now.ToString());
}
查看浏览器刷新后显示情况
去除Thread.Sleep(10000)注释 查看情况
16.2 缓存内容的管理
16.2.1 OutputCache指令的使用
|
CacheProfile |
字符串 |
配置文件的名称(在Web.config中定义)。默认值为空字符串 |
|
Duration |
整数 |
页面或用户控件被缓存的时间(单位秒) |
|
NoStore |
布尔型 |
用于指导是否发送“no store”缓存控制头(用于禁用敏感信息的二级存储)。对用户控件不适用。默认值为false |
根据查询字符串参数来区分缓存的内容:
16.2.2 HttpCachePolicy
使用HttpCachePolicy能够从另一个角度管理输出缓存。该对象可以通过Response类获得。
Response.Cache.SetNoServerCaching();
Response.Cache.SetLastModified(DateTime.Now);
16.2.3 缓存的位置设置
除了区分页面缓存的版本外,还可以选择缓存的位置。可以通过OutputCache指令的Location属性或HttpCachePolicy类的SetCacheability方法来修改此设置。
OutputCache指令支持一下几种输出缓存的位置设置:
n Any 允许浏览器,下游服务器和服务器缓存页面
n Client值一下在客户端缓存页面
n Downstream 只一下下游服务器和客户端缓存页面
n Server只一下服务器缓存页面
n None禁用缓存
如果使用HttpCachePolicy,则可以编程方式设置缓存内容位置。为此要用到HttpCachePolicy.SetCacheability方法(或HttpResponse.CacheControl属性),它接受一个HttpCacheability枚举参数。这个枚举包含以下成员,它们要逼OututCache指令中的Location 属性值更容易理解:
n NoCache禁用缓存
n Private只允许在客户端上缓存
n Public允许在客户端和共享代理上缓存
n Server允许在服务器上缓存
n ServerAndNoCache只允许在服务器上缓存输出,禁止在其他位置上进行缓存
n ServerAndPrivate只允许在服务器和客户端上缓存输出,禁止在其他位置上进行缓存(不允许代理服务器缓存输出)
16.2.4 输出缓存依赖项
16.2.5 缓存配置文件
设置配置文件:
Web.config文件
<configuration>
<system.web>
<compilation debug="true" targetFramework="4.0" />
<caching>
<outputCacheSettings>
<outputCacheProfiles>
<add name="profiles" duration="60" varyByParam="TextBoxName"/>
</outputCacheProfiles>
</outputCacheSettings>
</caching>
</system.web>
修改页面中的OutputCache指令
<%@ Page Language="C#" Trace="false" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="OutputCaching.Default" %>
<%@OutputCache CacheProfile="profile" %>
16.3 用户控件的缓存
缓存用户控件的输出:
添加用户控件 SiteMenu
头部添加 <%@ OutputCache Duration="60" VaryByParam="none" %>
在新页面 UseSiteMenuControl.aspx上 添加SiteMenu控件
启用页面跟踪 Trace="true"
浏览
刷新 发现 ASP.NET使用缓存的控件来替代了整个SiteMenu控件
16.4 适合应用输出缓存的场景
页面中的控件生成大量HTML
16.5 其他缓存提供程序
ASP.NET引入了一种新的输出缓存功能,允许将输出存储在内存以外的位置。开发者可以指定其他能够管理页面输出缓存的提供程序。这有助于实现高伸缩性策略(如云计算)。
自定义的输出缓存提供程序应派生自OutputCacheProvider类,并至少重写Add,Get,Remove和Set方法。Add方法用于添加缓存项,Get方法用于获取指定的缓存项,Remove用于删除缓存项,Set方法用于替换现有缓存项。
16.6 快速参考
|
缓存页面的输出 |
为页面添加OutputCache指令 |
|
根据查询字符串参数的不同来缓存不同版本的页面 |
设置OutputCache指令的VaryByParam特性 |
|
根据标头的不同来缓存不同版本的页面 |
设置OuputCache指令的VaryByHeader特性 |
|
根据浏览器不同了缓存不同版本的页面 |
将OuputCache指令的VaryByCustom特性设置为browser |
|
指定缓存内容位置 |
可以通过OuputCache指令的Location特性指定 |
|
以编程方式访问缓存属性 |
使用Response对象的Cache属性,该对象时HttpCachePolicy类的实例 |
|
通过web.config来管理输出缓存的行为 |
在web.config文件中添加outputCacheProfile元素,并在需要时引用 |
|
缓存用户控件 |
在用户控件的.ascx文件中添加OuputCache指令 |
诊断与插件
17. 诊断与调试
17.1 页面跟踪
Page类的Trace属性
17.1.1 跟踪
启动页面跟踪非常简单。只需要将页面中的Page指令的Trace特性设置为true即可。
17.1.2 跟踪语句
添加跟踪语句:
protected void Page_Load(object sender, EventArgs e)
{
alTableEntries = (ArrayList)this.Session["TableEntries"];
if (alTableEntries == null)
{
Trace.Warn("Page_Load", "alTableEntries is null");//Trace.Warn输出文本会以红色呈现
alTableEntries = new ArrayList();
}
AssembleTable();
}
protected void AssembleTable()
{
this.Table1.Rows.Clear();
foreach (String s in alTableEntries)
{
Trace.Write("AssembleTable", "String found: " + s); //语句跟踪语句
TableRow row = new TableRow();
TableCell cell = new TableCell();
cell.Text = s;
row.Cells.Add(cell);
this.Table1.Rows.Add(row);
}
}
protected void Button1_Click(object sender, EventArgs e)
{
Trace.Write("Button1_Click", "Adding string: " + this.TextBox1.Text);//语句跟踪语句
alTableEntries.Add(this.TextBox1.Text);
this.Session["TableEntries"] = alTableEntries;
AssembleTable();
}
17.2 应用程序跟踪
启用应用程序跟踪,需要设置web.config:
<configuration>
<system.web>
<trace enabled=”true”/>
</system.web>
</configuration>
使用应用程序级的跟踪:
1. 删除Page指令的Trace 特性
在web.config中启用应用程序级跟踪<trace enabled="true"></trace>
2. Ctrl+F5组合键,运行页面。
3. 在地址栏TraceMe.aspx修改为Trace.axd。这个URL会请求一个特殊处理程序,它能够呈现存储在内存中的跟踪结果。
17.2.1 以编程方式启用跟踪
protected void Page_Load(object sender, EventArgs e)
{
}
protected void Button1_Click(object sender, EventArgs e)
{
if (this.TextBoxSecretCode.Text == "password")
{
this.Trace.IsEnabled = true;//启?用®?跟¨²踪Á¨´
}
}
protected void Button2_Click(object sender, EventArgs e)
{
this.Trace.IsEnabled = false;//禁?用®?跟¨²踪Á¨´
}
17.3 使用Visual Studio 进行调试
调试应用程序:
Web.config
<compilation debug="true" targetFramework="4.0"/>
</system.web>
</configuration>
17.4 错误页面
我们可以通过修改web.config使ASP.NET在应用程序发生错误时发挥指定的页面。表17.2列出了web.config中设置自定义错误页面的相关设置。
|
defaultRedirect |
发生异常时显示的错误页面 |
|
Mode |
On=显示自定义的页面 |
|
remoteOnly |
向客户端显示自定义的错误页面,而只在本地显示ASP.NET的错误页面 |
设置错误页面:
Web.config
<configuration>
<system.web>
<trace enabled="true"/>
<compilation debug="true" targetFramework="4.0"/>
<customErrors defaultRedirect="SomethingBadHappened.htm" mode="On">
<error statusCode ="404" redirect="404Err.htm"/>
</customErrors>
</system.web>
</configuration>
17.5 处理未处理的异常
新建全局应用处理程序
Global.asax
<%@ Application Language="C#" %>
<script runat="server">
protected void Application_Start(object sender, EventArgs e) { }
protected void Session_Start(object sender, EventArgs e) { }
protected void Application_BeginRequest(object sender, EventArgs e) { }
protected void Application_AuthenticateRequest(object sender, EventArgs e) { }
protected void Application_Error(object sender, EventArgs e)
{
Exception ex = Server.GetLastError();
System.Diagnostics.Debug.WriteLine("Error in app: " + ex);
System.Diagnostics.Debug.WriteLine("Error in app: " + ex);
if (ex is HttpUnhandledException)
{
Context.ClearError();
Server.Transfer("somethingbadhappened.htm");
}
else
{
}
}
protected void Session_End(object sender, EventArgs e) { }
protected void Application_End(object sender, EventArgs e) { }
</script>
18. HttpApplication类与HTTP模块
18.1 Application对象—全局访问点
18.4.1 Application_Start
18.4.2 Application_End
18.4.3 Application_Error
18.4.4 Application_BeginRequest
18.4.5 Application_AuthenticateRequest
18.4.6 Seesion_Start
18.5 HttpApplication的事件
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设置为超时树(以分钟为单位) |
5 复合控件
5.1 复合控件与自定义控件
5.2 自定义的复合控件
protected TextBox textboxPalindrome;
protected Button buttonCheckForPalindrome;
protected Label labelForTextBox;
protected LiteralControl literalcontrolPalindromeStatus;
public event EventHandler PalindromeFound;
protected Table tablePalindromes;
protected ArrayList alPalindromes;
5.3 用户控件
5.4 这两种控件的适用范围
自定义复合控件和用户控件相似,因此二者似乎没必要同时出现在框架中。由于用户控件具有良好的“设计器”支持,所以视乎根本不需要使用自定义复合控件。然而,这两种控件各有所长,各有所短。
自定义复合控件的最大优势在于它能够以独立的程序集为单位进行部署。由于自定义复合控件包装与单独的程序集中,一次可以对其签名,并在企业也范围内进行部署。我们还可以将其安装在“全局程序集缓存”中。
用户控件的主要优势在于具有“设计器”支持,可以非常方便的通过可视化方式设计。
然而,用户控件也有缺点:这种控件必须伴随所做项目,实际也要这样被部署。我们可以在其他项目中复用现有用户控件,但是需要将相应的.ascx和cs文件复制到新项目中。此外这种控件不能通过签名的,安全的程序集进行部署。
| 在程序集中创建由其他服务器端控件复合而成的自定义复合控件 | 从System.Web.UI.WebControls.CompositeControl派生一个类。重写CreateChildControls方法。Visual Studio 包含一种能够满足这一要求的项目类型==“ASP.NET服务器控件” |
| 为自定义复合控件添加子控件 | 初始化要添加的子控件,并将其添加到宿主控件的Controls集合中 |
| 将自定义控件添加到“工具箱”中 | 打开“工具箱”(如果尚未显示,可以在主菜单中依次选择“视图”|“工具箱”)。在“工具箱”的任意位置右击,然后在快捷菜单中单击“选择项”。从列表中选择该控件,或通过浏览包括该控件的程序集来添加 |
| 使ASP.NET为复合控件中的子控件分配唯一的ID | 从ASP.Netk框架中的CompositeControl类派生自定义复合控件。用户控件本身具有该特性。 |
| 为复合控件添加自定义事件 | 通过event关键字暴露(使用public修饰符)该事件 |
| 通过Visual studio 的“设计器”来创建复合控件(用户控件) | 在Visual Studio 的网站项目中,根据项目类型在主菜单中选择“项目”或“网站”|“添加新项”,然后选择“Web用户控件” |
6 常用控件介绍
6.1 验证控件
1. RequiredFieldValidator 能够确保字段必须填入数据
2. RangeValidator 能够确保控件的数据在某一个特点范围内
3. RegularExpressionValidator 能够验证控件中的数据是否匹配某一正则表达式
4. CompareValidator 能够通过将控件中的数据与某个值或另一个控件的数据比较来验证数据的有效性
5. CustomValidator 允许自定义服务器端和客户端的验证过程
6. ValidationSummary 能够显示页面上所有验证错误的摘要
所有验证控件的使用方法基本相同。首先在页面上定义常规控件。然后添加相应验证控件,将其置于希望显示错误消息的位置。验证控件包含一个名为ControlToValidate的属性,要使其指向被验证的控件,而其他工作会自动被完成。当然,对于来自验证控件的错误消息,还有许多用于定义其显示方式的属性。
ASP.NET验证控件支持一下服务器端控件:
n TextBOx
n ListBox
n DropDownLIst
n RadioButtonLIst
n HtmlInputText
n HtmlInputFile
n HtmlSelect
n HtmlTextArea
n FileUpdateload
6.2 页面验证的工作方式
6.2.1 客户端验证
Javascript
6.2.2 服务器端验证
创建利用验证控件的页面
添加验证控件后 依次单击ControlToValidate属性组合框 选择验证对象
对于ValidationSummary控件,我们将ValidationSummary.ShowMessageBox属性设置为true 用于弹出Javascript 窗口提示错误
通过RegularExpressionValidator 确保用户只在“Postal Code”输入数字:
n 添加RegularExpressionValidator 控件
n 将ControlToValidate指向验证对象控件
n 将ErrorMessage属性设置为“The postal code you provided is invalid”
n 单击属性窗口的 ValidationExpression 在“正则表达式编辑器”对话框中,选择“美国邮政编码”作为验证表达式
通过CompareValidator验证控件 验证两次输入的密码是否相同:
n 添加CompareValidator 验证控件
n 设置ControlValidator 属性为验证对象控件
n 设置ErrMessage属性为要显示的文字
n 设置ControlToCompare设置要比较的对象
通过CompareValidator验证控件设置年龄范围:
n 添加CompareValidator 验证控件
n 设置ControlValidator 属性为验证对象控件
n 设置ValueToCompare属性设置为30
n 将Type属性设置为整型
n 设置ErrMessage为错误消息
n 将Operator属性设置为LessThanEqual 小于或等于
6.3 其他验证控件
RangeValidator与CompareValidator类似,可以将控件中的数据与值进行比较。不过RangeValidator会在数据超出某范围时报告错误。我们可以为这种验证控件指定一个最小值和最大值。
CustomValidator 实现其他类型的验证逻辑,我们可以像其他验证控件一样使用CustomValidator。然而,该控件没有预先定义验证逻辑(服务器和客户端都没有),而是留给开发者定义。在页面添加CustomValidator后,可以将其与目标控件关联,然后引用验证函数(需要编写服务器端代码)。也可以指定发送给客户端的验证脚本块,使其与其他客户端验证脚本一起执行。
最后,为支持“动态数据”(Dynamic Data)模型,ASP.NET引入了一个新的验证控件——DynamicValidator。ASP.NET的“动态数据”模型支持数据驱动的应用程序开发。DynamicValidator控件能够捕获数据绑定和验证过程中出现的所有异常并将这些异常转发给页面的验证事件。
6.4 验证控件的属性
验证控件包含其他ASP.NET标准控件具有的标准属性。例如,Text、Font和给中用于设置外观的属性。此外,对于浏览器发送的错误消息,验证控件业有对其进行管理的属性。
Display属性可以使Static或Dynamic。该属性能够绝对错误消息在哭护短的显示方式。S太提成会是验证控件为哭护短生成的span袁术实现预留显示错误消息的布局空间,即便这些消息未被显示。如果将Display属性设置为Dynamic,验证控件生成的span袁术则不会预留控件,而是在消息显示是展开。
ASP.NET 还能够对验证控件进行分组。也就是说,每个验证控件可以从属于某个指定的组。为此,要将ValidationGroup 属性设置为组别的名称。如果某个控件属于一个组,那么该组中任何一个控件引发验证过程,整个组的所有控件都会被验证。这使得页面具有“多表单”效果。
另外的几种有趣控件:3种基于图片的控件,TreeView和MultiView 控件。
6.5 基于图片的控件
向页面添加图片控件:
添加Image控件
设置ImageUrl属性
类似添加ImageButton
添加ImageMap
记录放大区域图片坐标,制作放大后图片
设置HostSpot属性,添加图片及设置响应的坐标位置
6.6 TreeView
TreeView控件的使用:
从工具箱中拖放一个TreeView控件。
在设计视图中单击TreeView控件的智能标签,在弹出的“TreeView任务”中选择套用格式,可以选择不同效果。
右击TreeView控件,选择“编辑节点”。此时会打开“TreeView节点编辑器”。我们可以通过这个编辑器来编辑每个节点。
使用BorderStyle和BorderColor属性为TreeView添加边框。将边框样式设置为Solid,将颜色设置为Black。这只是为了美观。
添加一些功能:
/// <summary>
/// 选?择?节¨²点Ì?更¨¹改?时º¡À事º?件t
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
protected void TreeView1_SelectedNodeChanged(object sender, EventArgs e)
{
this.LabelSelectedNode.Text = String.Format("Selected Node changed to: {0}",
this.TreeView1.SelectedNode.Text);
TreeNodeCollection childNodes = this.TreeView1.SelectedNode.ChildNodes;
if (childNodes != null)
{
this.TextBoxInfo.Text = String.Empty;
StringBuilder sb = new StringBuilder();
foreach (TreeNode childNode in childNodes)
{
sb.AppendFormat("{0}\n", childNode.Value);
}
this.TextBoxInfo.Text = sb.ToString();
}
}
6.7 MultiView
MultiView和View控件的使用
1. 为ControlPotpourri网站添加一个“Web窗体”,将其命名为UseMultiview.aspx。
2. 向“Web窗体”添加一个MultiView控件。
3. MultiView的主要目的是用于管理内部所有的View。为向Multiview添加View,可以从工具栏拖放View的实例到MultiView的“内部”。
4. 为每个View控件添加一些内容。可以认为View与窗格非常类似。在这个示例中,每个视图中包含的是用于标识自身标签。
5. 激活第一个窗体。为使Multiview中的第一个View显示出来,需要将Multiview的ActiveViewIndex设置为0.
6. 为在Multiview的不同View之间进行导航,在表单底部添加两个按钮,分别命名为ButtonPrev 和 ButtonNext。
7. 分别双击这两个按钮,为它们添加事件处理程序。
| 验证表单的输入 | 对于服务器空间,ASP.NET包含许多能够校验其中数据的验证空间,如下所示: n CompareValidator n RangeValidator n RequiredFieldValidator n RegularExpressionValidator n ValidationSummary n CustomValidator 为验证服务器端控件的输入,将适当的验证控件拖放到页面上,将ControlToValidate属性设置为目标控件的ID,并合理设置其他属性 |
| 直观的显示层次型数据 | n 使用TreeView控件 n 可以手动添加项或将TreeView绑定到层次数据源。 |
| 在同一网页上切换不同信息页 | n 使用MultiView和View控件 n 可以将View看做小型页面的管理控件 n MultiView用于管理View集合,并支持不同View之间切换 |
| 在网页中添加图片 | n 在页面上添加Image控件 n 将Image控件的ImagUrl属性设置为待显示图片的URL |
| 在网页中添加带有可点击区域的图片 | n 在页面上添加ImageMap控件 n 使用“HotSpot 集合编辑器”来定义可点击的区域 |
第II部分 高级特性
7 一致的界面
7.1 用户界面一致性的管理
7.2 ASP.NET母版页
母版页是一种配置页面,其结构与一般的页面非常类似。不过母版页文件的扩展名为.master。母版页是一种模板,能够为依赖于它的所有页面呈现相同的外观。
母版页与一般的.aspx页面一样,可以包含一般页面能够包含的所有内容和功能。换言之,母版页可以包含服务器控件,用户控件和文本标记。除了一般的控件和标记,母版页还可以包含System.Web.UI.WebControls.ContentPlaceHolder(内容占位符)控件的实例。顾名思义,内容占位符所在的位置最终会显示基于母版页的页面所提供的实际内容。母版页会呈现它所包含的所有元素—所有未包含在System.Web.UI.WebControls.ContentPlaceHolder控件的元素。
由于母版页要参与最终页面处理程序的融合过程,一次母版页的工作方式不同于之前提到的直接继承技术(即通过基类实现公共的功能)。在页面执行时,母版页会将自身内容注入到.aspx页面中。具体来说,母版页中的空间最终会被添加到.aspx页面的Controls集合中,这些空间的呈现方式和其他控件的呈现方式完全相同。
与一般页面类似,母版页可以在MasterPage指令中包含以下属性:
n AutoEventWireup
n ClassName
n CompilerOption
n Debug Description
n Inherits
n Language
n Strict
n Src
n WarningLevel
n Master
使用母版页:
添加母版页
使用母版页
选择母版页
Visual Studio 会为该页面生成以下代码来使其支持母版页:
<%@ Page Title="" Language="C#" MasterPageFile="~/MasterPage.Master" AutoEventWireup="true" CodeBehind="UseMasterPage.aspx.cs" Inherits="MasterPageSite.UseMasterPage" %>
<asp:Content ID="Content1" ContentPlaceHolderID="head" runat="server">
</asp:Content>
<asp:Content ID="Content2" ContentPlaceHolderID="ContentPlaceHolder1" runat="server">
</asp:Content>
为UseMasterPage.aspx添加一些内容。在内容占位符控件中添加一个标签控件,输入一些文本以便能够将其与其他页面区分开来(见下图)。
7.3 主题
1. 为MasterPagesSite 的项目 添加一个“不使用”母版页的页面,并将其命名为UseThemes.aspx.
2. 添加一个主题文件夹。在“解决方案资源管理器”中的网站节点上右击,依次选择“添加”|“添加ASP.NET文件夹”|“主题”。此时,Visual Studio 会创建一个名为App_Themes的目录。
3. 添加App_Themes 后,Visual Studio会自动创建一个子文件夹。我们将其命名为Default。
4. 为Default文件夹添加一个样式表。在“解决方案资源管理器”中的项目节点上右击,选择“添加”|“新建项”。选择“样式表”模板,将这个样式表命名为Default.css。将这个Default.css文件拖入App_Themes\Default文件夹。此样式表会在页面应用名为Default的主题时生效。
5. 下面修改这个样式表。
应用主题
<%@ Page Language="C#" AutoEventWireup="true" Theme="SeeingRed" CodeBehind="UseThemes.aspx.cs" Inherits="MasterPageSite.UseThemes" %>
7.4 皮肤
创建皮肤:
1. 创建一个皮肤文件。在“解决方案资源管理器”的App_Theme\SeeingRed文件夹上右击,选择“添加”|“新建项”。在模板列表中选择“外观文件”,将其命名为SeeingRed.skin。
2. 在SeeingRed.skin 文件中,选声明几个控件,并分别设置一组属性。
<asp:Label runat="server" ForeColor="red" Font-Size="14pt" Font-Names="Verdana" />
<asp:button runat="server" borderstyle="Solid" borderwidth="2px" bordercolor="#ff0000" backcolor="#cc0000"/>
<asp:CheckBoxList runat=server ForeColor="#ff0000" />
<asp:RadioButtonList runat=server ForeColor="#ff9999" />
在页面声明使用SeeingRed主题后,SeeingRed.skin 文件会自动生效。在运行时,我们也可以在页面的PreInit事件处理程序中设置每个控件的皮肤。
| 在网站中定义一系列具有一致感观的页面 | 为网站添加母版页 |
| 创建基于母版页的页面 | 添加“使用母版页的Web窗体”,并选择所要应用的母版页 |
| 在母版页中添加会最终显示在内容页的元素 | 将这些元素添加到ContentPlaceholder控件之外的位置 |
| 添加内容页特有的元素 | 将这些元素添加到内容页Content控件中 |
| 为页面创建主题 | 在应用程序的App_Themes目录为主题添加一个文件夹。通过“级联样式表”来为主题定义样式和类别 |
| 将主题应用到页面 | 可以在aspx文件中设置Page指令的Theme属性,也可以在页面的PreInit事件被引发时设置Theme属性 |
| 创建皮肤 | 在主题所在文件夹下创建一个文本文件,为其添加.skin扩展名,并添加带有默认属性值的空间声明 |
8 配置
8.1 Windows的配置机制
早期的Windows 中,使用初始化(initialization)文件(.ini文件)来配置每个应用程序和Windows 操作系统本身(甚至有一套专门管理配置参数的Windows 应用程序编程接口)。
如今,XML成为主流配置技术。.NET使用XML文件来存储配置信息。
(在过去,还可以通过注册表(registry)来配置应用程序。注册表是一种集中式的数据库,应用程序可以在其中存储键/值对。ASP.NET没有使用注册表来存储配置信息是因为注册表是全局的,直接影响ASP.NET在开发上的灵活性。存储在注册表中的设置要使用Registry API来复制,而配置文件更易于复制。此外,为防止黑客的攻击,运行ASP.NET网站的账户一般都不具备有注册表的访问权限)
8.2 .NET的配置机制
.NET配置文件时规范的XML文件,其关键字受.NET运行库支持。配置目录中(稍后会介绍)包含所有类型的配置文件。
8.2.1 Machine.Config
计算机默认的.NET配置是在一个名为machine.config的文件中声明的。Machine.config文件可以在C:\Windows\Microsoft.NET\Framework\vxxxxx\Config路径下找到(xxxxx为.NET版本)。Machine.config包含计算机中所有.NET应用程序行为的默认设置。
8.2.2 配置节处理程序
Machine.config的最顶端罗列了许多配置节处理程序。这些处理程序能够解释配置.NET所使用的关键字。
用的关键字。Machine.config包含计算机范围的设置,而ASP.NET应用程序通过名为web.config的文件管理设置。稍后会详细介绍web.config,这里先给出某Web应用程序Web.config文件的一部分:
<?xml version=”1.0” endcoding=”utf-8”?>
<configuration>
<system.web>
<authentication mode=”Forms” />
<sessionState mode=”SQLServer” cookieless=”UseUri” timeout=”25” />
</system.web>
</configuration>
这个片段告诉ASP.NET运行库采用”Forms身份验证”来对网站的用户进行身份验证。此设置还会使用ASP.NET使用SQL Server来管理会话状态,使会话状态信息在25分钟后过期,并使用嵌在“统一资源标识符”中的会话ID来跟踪会话信息。
从这个例子中我们可以看出,为配置ASP.NET,运行库需要能够理解某些关键字。上面给出的配置为使ASP.NET理解为如何管理身份验证,使用了authentication、mode和Forms关键字;而为了通过相应关键字来配置会话状态,ASP.NET需要正确解释sessionState、mode、SQLServer、cookieless、UseURI和timeout
8.2.3 web.config
Machine.config文件为计算机提供了默认设置(这些设置会最终提供给特定的应用程序)。这些默认设置适用于一般情况,而特定的应用程序可能需要特殊的配置。例如,sessionState默认会被设置成“进程内”处理方式。
同一天计算机上所有的.NET应用程序都依赖于machine.config文件配置,修改该文件可能会影响到多个应用程序。因而直接修改这个文件并不明智。
Microsoft Visual Studio 2010 引入了一个新功能 分别为应用程序的debug版本和release版本提供配置支持。Web.config、web.dubug.config和web.release.config。
Web.config中包含debug和release共享设置,其他两个配置文件则分别针对debug和release版本。
Web.config提供ASP.NET的初始配置。然后,在请求露肩中,开发者可以通过子web.config文件来为单个应用程序提供针对特定文件夹的设置。
8.2.4 ASP.NET 1.x 的配置管理
在ASP.NET 1.x中,需要在目标web.config文件中以手动输入的方式修改设置。例如,如果要采用SQLServer来作为应用程序的会话状态数据库,则需要在应用程序的web.config文件中逐字输入正确的关键字。不幸的是,没有能够确保配置文件语法正确的配置编译器。如果输入有误,则很难意识到错误的存在,知道运行应用程序时APS.NET显示错误消息。
8.2.5 ASP.NET 后续版本的配置管理
配置应用程序:
1. 创建ConfigORama的 ASP.NET空Web应用程序 项目
2. 单击 “项目”|“ASP.NET配置”。此时会打开“网站管理工具”。
3. 在“应用程序”选项卡中,通过“创建应用程序设置”链接为应用程序添加两个设置,Copyright和CompanyName。
4. 打开应用程序的web.config文件。我们可以可到这两个数据项。
5. 以编程方式访问更改添加的应用程序设置。要用刀ConfigurationManager类。
8.3 在IIS中配置ASP.NET
使用IIS配置ASP.NET
应用程序设置:
开应用程序web.config文件查看:
母版页设置属性获取配置
protected string BackgroundColor
{
get
{
return ConfigurationManager.AppSettings["BackgroundColor"];
}
}
应用配置
<body style="background-color: <%=BackgroundColor%>">
| 查看全局配置文件 | 在Windows目录的Microsoft.Net\Framwork\vxxxx\config文件夹下查找,其中xxxxx代表网站所有的ASP.NET版本 |
| 修改特定ASP.NET应用程序设置 | 在应用程序目录下添加web.config文件,并在该文件中进行设置 |
| 修改虚拟目录下子目录的设置 | 在子目录中添加单独的web.config文件,或者在虚拟目录下的web.config文件中使用location关键字 |
| 通过“网站管理工具”(WSAT)来修改应用程序的设置 | 打开IIS管理器。选择Web应用程序的虚拟目录,双击要查看或修改的设置所对应的图标 |
| 通过IIS的ASP.NET配置工具来修改应用程序的设置 | 打开IIS管理器。选择Web应用程序的虚拟目录,双击要查看或修改的设置所对应的图标 |
| 获取配置文件中的设置 | 使用ASP.NET中的ConfigurationManager类 |
ASP.NET 4 学习笔录
基础知识
1. Web应用程序基础
1.1 HTTP 请求
1.1.1 从浏览器发出的HTTP请求
1.1.2 在不使用浏览器的情况下生成请求
构建一个简单的HTTP请求程序
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net;
using System.IO;
namespace WebRequestorApp
{
class Program
{
static void Main(string[] args)
{
WebRequest req = WebRequest.Create("http://www.microsoft.com");
WebResponse resp = req.GetResponse();
StreamReader reader = new StreamReader(resp.GetResponseStream());
Console.WriteLine(reader.ReadToEnd());
Console.ReadLine();
}
}
}
1.2 超文本标记语言
<!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>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>无标题文档</title>
</head>
<body>
<h2>Hello there. Whate's your favorite .NET feature?</h2>
<select name="Feature">
<option>Type-Satety</option>
<option>Garbage collection</option>
<option>Multiple syntaxes</option>
<option>Simpler threading</option>
<option>Versioning purgatory</option>
</select>
<br />
<input type="submit" name="Lookup" value="Lookup" />
<br />
</body>
</html>
1.3 动态内容
1.3.1 HTMl表单
1.3.4 Internet信息服务
1.4 传统的ASP:ASP.NET前身
<%@LANGUAGE="VBSCRIPT" CODEPAGE="65001"%>
<!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>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>无标题文档</title>
</head>
<body>
<form>
<h3>Hello world!!! This is an ASP page.</h3>
<%Response.Write("This content was generated ");%>
<%Response.Write("as part of an execution block");%>
</form>
</body>
</html>
1.5 Web开发思想
处理两大问题:
n 在无线连接型协议上通过HTML来管理用户界面(UI);
n 管理应用程序状态。
1.6 ASP.NET
ASP.NET1.0 引入一条明确管线、高效、扩展、服务器控件、简化模型
ASP.NET2.0 极大改进身份验证与授权服务方面
ASP.NET3.5 支持异步Java和XML风格编程
1.7 IIS快速参考
|
打开“Internet 信息服务(IIS)管理器” |
打开“控制面板”,找到“管理工具”,选择“Internet信息服务管理器” |
|
新建虚拟目录 |
打开“Internet 信息服务(IIS)管理器”,依次展开“网站”|Default Web Site。在Default Web Site。在Default Web Site 节点上右击,选择“添加虚拟目录”。然后根据向导的提示进行操作 |
|
在IIS中浏览某个资源 |
在所有要浏览的资源上右击,然后选择“浏览”图标按钮 |
|
查看特定IIS虚拟目录中支持的文件类型 |
选择该虚拟目录,在“过年视图”中浏览“处理程序映射”和“模块”页面 |
2. ASP.NET 应用程序基础
2.1 经典的Hello World程序
构建Hello World Web应用程序
1. 创建将要包含Web应用程序文件的目录。
2. 创建一个放置文件的应用程序/虚拟目录。
3. 制作一个简单的HTML页面。
4. 浏览这个页面。
5. 将这个HTML文件转换为ASP.NET应用程序。
6. 查看浏览器所解析的HTML源代码。
2.1.1 可执行代码与HTML的混合
<%@ Page Language="C#" ContentType="text/html" ResponseEncoding="utf-8" %>
<!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>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>无标题文档</title>
</head>
<body>
<%
Response.Write("Check out the family tree: <br> <br>");
Response.Write(this.GetType().ToString());
Response.Write(" which derives from: <br> ");
Response.Write(this.GetType().BaseType.ToString());
Response.Write(" which derives from: <br> ");
Response.Write(this.GetType().BaseType.BaseType.ToString());
Response.Write(" which derives from: <br> ");
Response.Write(this.GetType().BaseType.BaseType.BaseType.ToString());
Response.Write(" which derives from: <br> ");
Response.Write(this.GetType().BaseType.BaseType.BaseType.BaseType.ToString());
%>
</body>
</html>
2.1.2 服务器端的可执行块
<%@ Page Language="C#" ContentType="text/html" ResponseEncoding="utf-8" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<script runat="server">
void ShowLineage()
{
Response.Write("Check out the family tree: <br> <br>");
Response.Write(this.GetType().ToString());
Response.Write(" which derives from: <br> ");
Response.Write(this.GetType().BaseType.ToString());
Response.Write(" which derives from: <br> ");
Response.Write(this.GetType().BaseType.BaseType.ToString());
Response.Write(" which derives from: <br> ");
Response.Write(this.GetType().BaseType.BaseType.BaseType.ToString());
Response.Write(" which derives from: <br> ");
Response.Write(this.GetType().BaseType.BaseType.BaseType.BaseType.ToString());
}
</script>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>无标题文档</title>
</head>
<body>
<h1>Hello World!!!</h1>
<%
// This block will execute in the Render_Control method
ShowLineage();
%>
</body>
</html>
2.2 ASP.NET编译模型
查看ASP.NET程序集
n 为运行ILDASM,请打开“Visual Studio 命令提示(2010)”,然后输入ILDASM。
n 选择“文件”|“打开”命令。
n 查找 ASP.NET 运行库编译的程序集。进入 C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\Temporary ASP.NET Files\aspnetstepbystep4\......
2.3 编码风格
2.3.1 ASP.NET 1.x风格
2.3.2 现代ASP.NET 风格
2.4 ASP.NET HTTP管线
2.4.1 IIS 5.x和IIS 6.x 的管线
2.4.2 IIS 7.x集成的管线
2.4.3 管线内部的组件
2.4.3.1 HttpApplication
2.4.3.2 HttpContext
-- Response 对象的引用(可用于向客户端发送输出)
-- Request 对象的引用(可用于获取有关请求变身的信息)
-- 中心应用程序本身的应用(可用于获取应用程序的状态)
-- 针对每个请求的字典的引用(可用于在请求的生命周期中存储数据)
-- 应用程序范围缓存的引用(可用于存储数据,从而避免与数据库的频繁交互)
2.4.3.3 HttpModule
2.4.3.4 HttpHandler
2.5 Visual Studio与ASP.NET
2.5.1 本地IIS网站
2.5.2 基于文件系统的网站
2.5.3 FTP网站
2.5.4 远程网站
2.5.5 Hello World 与 Visual Studio
创建HelloWorld Web应用程序
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="HelloWorld.aspx.cs" Inherits="HelloWorld" %>
<!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>
</head>
<body>
<form id="form1" runat="server">
<div>
<h2>Hello World!</h2>
<%
ShowLineage();
%>
</div>
</form>
</body>
</html>
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
public partial class HelloWorld : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
}
public void ShowLineage()
{
Response.Write("Check out the family tree: <br> <br>");
Response.Write(this.GetType().ToString());
Response.Write(" which derives from: <br> ");
Response.Write(this.GetType().BaseType.ToString());
Response.Write(" which derives from: <br> ");
Response.Write(this.GetType().BaseType.BaseType.ToString());
Response.Write(" which derives from: <br> ");
Response.Write(this.GetType().BaseType.BaseType.BaseType.ToString());
Response.Write(" which derives from: <br> ");
Response.Write(this.GetType().BaseType.BaseType.BaseType.BaseType.ToString());
}
}
|
在Visual Studio 2010中创建FTP网站 |
在主菜单中依次选择“文件”|“新建”|“网站”命令。在“Web位置”组合框中选择“FTP”。该选项适合创建最终通过FTP协议部署的网站 |
|
在Visual Studio 2010中创建HTTP网站 |
在主菜单中依次选择“文件”|“新建”|“网站”命令。在“Web位置”组合框中选择“HTTP”。该选项适合创建在整个开发期间将IIS作为Web服务器的网站 |
|
在Visual Studio 2010 中创建基于文件系统的网站 |
在主菜单中一次选择“文件”|“新建”|“网站”命令。在“Web位置”组合框中选择“文件系统”。该选项会使网站使用Visual Studio 内建的Web服务器。这样可以在计算机未安装IIS的情况下开发网站 |
3. 页面呈现模型
3.1 将控件呈现为标签
4. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
5. <html xmlns="http://www.w3.org/1999/xhtml">
6. <head>
7. <title>Untitled Page</title>
8. </head>
9. <body>
10. <h2>
11. Page in HTML</h2>
12. <form method="post" action="BuchOfControls.htm" id="Form1">
13. <label>
14. Type in me</label>
15. <input name="textinfo" type="text" id="textinfo" />
16. <br />
17. <select name="selectionitems">
18. <option value="Item 1">Item 1</option>
19. <option value="Item 2">Item 2</option>
20. <option value="Item 3">Item 3</option>
21. <option value="Item 4">Item 4</option>
22. </select>
23. <br />
24. <input type="submit" name="clickme" value="Click Me!" id="clickme" />
25. </form>
26. </body>
27. </html>
28.
29. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
30. <html xmlns="http://www.w3.org/1999/xhtml">
31. <head>
32. <title>Untitled Page</title>
33. </head>
34. <body>
35. <h2>
36. Page in Classic ASP</h2>
37. <form>
38. <label>
39. Type in me</label>
40. <input name="textinfo" type="text" id="textinfo" />
41. <br />
42. <select name="selectionitems">
43. <option value="Item 1">Item 1</option>
44. <option value="Item 2">Item 2</option>
45. <option value="Item 3">Item 3</option>
46. <option value="Item 4">Item 4</option>
47. </select>
48. <br />
49. <input type="submit" name="clickme" value="Click Me!" id="clickme" />
50. <p>
51. <% if(Request("textinfo") !=""){ %>
52. This was in the text box:
53. <%=Request("textinfo") %><br />
54. And this was in thie selection control:<%Request("selectitems") %>
55. <%} %>
56. </p>
57. </form>
58. </body>
59. </html>
60.
3.2 将界面元素包装成组件
3.2.1 ASP.NET页面
4 <%@ Page Language=C# trace=true %>
5
6 <script type="text/C#" runat="server">
7 protected void Page_Load(object sender, EventArgs ea)
8 {
9 if(!IsPostBack)
10 {
11 ddl.Items.Add("Item 1");
12 ddl.Items.Add("Item 2");
13 ddl.Items.Add("Item 3");
14 ddl.Items.Add("Item 4");
15 }
16 }
17 </script>
18
19 <h2> Page in ASP.NET </h2>
20
21 <form id="Form1" runat="server" >
22 <asp:Label Text="Type in me" runat="server" />
23 <asp:TextBox id="textinfo" runat="server" />
24 <BR>
25 <asp:DropDownList id="ddl" runat="server" />
26 <BR>
27 <asp:Button id="clickme" Text="Click Me!" runat="server" />
28 </form>
29
30
3.1.2 页面的呈现模型
Trace 属性被设为True 时,ASP.NET 会记录请求和响应的整个上下文。
<%Page Language=”C#” Trace=”true”%>
3.1.3 页面的控件树
3.3 使用Visual Studio 添加控件
使用Visual Studio 构建一个页面
|
在ASPX的“源”视图和“设计”视图之间切换 |
切换到“设计”或“源”选项卡,他们通常显示在编辑器窗口的左下角。也可以使用“拆分”选项卡来同时显示“源”和“设计”视图 |
|
在页面中添加服务器端控件 |
打开“工具箱”。如果该窗口没有被显示,可以在主菜单中一次选择“视图”|“工具箱”选项。(也可以使用组合键Ctrl+W,X。) 在“工具箱”中单击该控件,并将其拖放到页面上 |
|
修改页面上控件的属性 |
确保页面设计器处于“设计”模式。选中要编辑属性的控件。 在“属性”窗口中修改目标的属性 |
|
启用跟踪 |
在“源”代码编辑模式下,为Page指令添加Trace=“true”属性。 或者 在“属性”窗口顶部选中DOCUMENT 元素,将Trace 属性设置为True |
|
修改服务器端控件的大小 |
选中该控件,用鼠标拖动控件边框上的手柄,知道将控件调整到合适大小 |
|
为控件的默认事件添加处理程序 |
双击要添加事件处理程序的控件。此时会显示代码编辑器,可以为此事件的处理程序添加代码 |
|
修改页面的布局方式 |
在主菜单上依次单击“格式”|“新建样式”命令。在“类别”中选择“布局”,在右侧定义样式(除布局外,还可以定义字体样式和页边空白等属性)。该样式可以应用到整个页面,业可以应用到单个元素。 |
4 自定义控件
4.1 Control类
Page类主要的属性、方法和事件
|
成员 |
说明 |
|
Application |
当前请求的HttpApplicationState对象的引用 |
|
Cache |
应用程序缓存的引用,缓存即内存中应用程序范围的状态字典(通常用于优化) |
|
Controls |
Page维护的控件集合 |
|
CreateChildControls |
页面创建其控件树时调用的虚方法 |
|
Init |
指示页面已被初始化的事件 |
|
IsPostBack |
用于判断当前请求是新的请求或回发的属性 |
|
Load |
指示页面已加载的事件 |
|
Request |
引用的是一个有状态对象,代表传入的请求 |
|
Response |
引用的是一个有状态对象,代表传出的响应 |
|
Session |
引用的是一个有状态对象,其中包括针对当前请求的信息 |
|
Unload |
指示页面已经被卸载的事件 |
4.2 Visual Studio 与自定义控件
创建自定义控件
在主菜单中依次选择“生成”|“生成解决方案”,生成项目。
通过编译后,Visual Studio 便自动将其添加到“工具箱”中,供主项目使用。
4.3 回文验证器
构建一个回文验证器
4.4 HtmlTextWriter与控件
5 //HtmlTextWriter
6 if (this.CheckForPalindrome())
7 {
8 output.Write("This is a palindrome: <br>");
9 output.RenderBeginTag(HtmlTextWriterTag.Font);
10 output.AddStyleAttribute(HtmlTextWriterStyle.Color, "blue");
11 output.RenderBeginTag(HtmlTextWriterTag.B);
12 output.Write(Text);
13 output.RenderEndTag(); // bold
14 output.RenderEndTag(); // font
15 }
16 else
17 {
18 output.Write("This is NOT a palindrome: <br>");
19 output.RenderBeginTag(HtmlTextWriterTag.Font);
20 output.AddStyleAttribute(HtmlTextWriterStyle.Color, "red");
21 output.RenderBeginTag(HtmlTextWriterTag.B);
22 output.Write(Text);
23 output.RenderEndTag(); // bold
24 output.RenderEndTag(); // font
25 }
26 output.Write("<br>");
27
HtmlTextWriter类和相应的枚举掩盖了HTML3.2和HTML4.0之间的差异。根据不同版本生成对应HTML。
4.6 控件与视图状态
使用ViewState
ViewState["Text"] = value;
string text = value;
this.alPalindromes = (ArrayList)this.ViewState["palindromes"];
if (this.alPalindromes == null)
{
this.alPalindromes = new ArrayList();
}
if (this.CheckForPalindrome())
{
if (PalindromeFound != null)
{
PalindromeFound(this, EventArgs.Empty);
}
alPalindromes.Add(text);
}
ViewState.Add("palindromes",alPalindromes);
|
新建呈现过程可控的自定义控件 |
从System.Web.UI.Control派生一个类。重写RenderControl方法。也可以使用Visual Studio中的一种名为“ASP.NET服务控件”的项目类型 |
|
将自定义控件添加到“工具箱” |
打开“工具箱”(如果其尚未被显示,可以在主菜单中一次选择“视图”|“工具箱”)。在“工具箱”的任意位置单击右击键,然后在快捷菜单中单击“选择项”。从列表中选择该控件,或通过浏览包含该控件的程序集来添加 |
|
修改页面上控件属性 |
确保页面的编辑器处于“设计”视图。选择目标控件,并在“属性”窗口中编辑所要修改的属性 |
|
管理页面上所有控件所引发的事件 |
确保页面的编辑器处于“设计”视图。选择目标控件,在事件窗口中选择所要处理的事件(单击“属性”窗口上端的闪电图标)。可以通过双击它来使Visual studio 插入相应的处理程序,也可以直接输入处理程序的名称 |
|
存储特殊的视图状态信息 |
确保所要存储的数据类型是可序列化的,并使用空间的ViewState属性(一种键/值集合)。在获取之前存储的信息时,应确保使用系统的索引值/键 |
|
编写与浏览器版本无光的呈现代码 |
使用HtmlTextWriter的标签呈现方法来插入标签,而不要硬编码。ASP.NET会根据浏览器的标头信息来决定将哪种HtmlTextWriter传入RenderControl |



























































