ASP.NET 2.0入门经典(第4版)
2.1 总体设计目标
在开始开发Web站点之前,通常应该设想好站点所具有的功能;例如,一个博客(blog)站点,必须能够对帖子进行分类存储、向帖子添加评论,还需有进行管理的模块,这些是最少的功能。另外,考虑一个简单的零售商店,它想进入电子商务领域,它希望通过Web站点让客户浏览并购买商品。在着手开发任何一个站点之前,都必须仔细地考虑和设计,之后才能编写代码实现站点。
在开始讨论具体技术的实现时,我们应先讨论如何使用ASP.NET 2.0服务器端控件所支持的功能开发设计良好的站点。毕竟,创建、使用和维护经过良好设计的站点要容易得多,而且维护费用更低。
本章将介绍以下概念:
● 怎样启动站点的设计流程,并在开始编写代码之前考虑站点的所有需求。
● 使用Master和Content页面实现站点的一致外观,这是ASP.NET 2.0最重要的新功能。
● 创建站点地图,该地图表明站点中存在哪些页面,以及这些页面在层次上与其他文件是什么关系。
● 使用Web.config和Global.asax文件保存数据和代码的全局配置,这些配置将用于站点的所有页面。
在本章的结束部分有一些练习可以帮助加深对这些概念的理解。
1.1 总体设计目标
设计一个功能完整的Web应用程序是一项很复杂的任务。如果是开发自己的站点,可能对站点是什么样子考虑得已经很多很具体了,所以在开始编写代码之前知道自己要做什么。然而,如果是为客户开发站点,就必须确保在站点的设计上与客户在各个细节上达成高度的一致。在一个专业的开发环境中,这个过程通常包括如下步骤:
● 开发一个功能模型,该模型描述站点的具体运行情况。当用户单击Log In按钮时会发生什么事情?当用户想浏览产品时哪些功能是可用的?在开始设计之前,需要回答这些问题以及其他很多问题,以免最后开发出来的站点不是客户想要的!
● 确定在实现站点的过程中可以使用的技术。很多主机软件包对数据库的支持都有不同程度的限制,进而限制站点的总体大小,所以要尽早讨论这个问题并确保能使用所希望使用的技术。
● 开发一个技术说明书,描述怎样实现所需的功能。例如,对于博客站点,当用户单击按钮发布新帖子的时候,如何确保将用户输入的文本保存到数据库中?描述要尽可能地详细,因为以后维护这个站点的人很可能不再是当初的开发人员。
这似乎需要做很多工作,但即使是对比较小的企业或者单个贸易承包人,遵循这个流程将帮助开发人员和客户保持良好的合作关系,并为将来和客户以及客户的朋友或商业伙伴继续合作打下基础。
从一旦业务端进入实现阶段,就要开始考虑如何实现这个应用程序,如何使得站点的设计符合客户的需求。创建Web应用程序并不仅仅要求能正确地使用ASP.NET 2.0服务器端控件,因为网页的具体设计和布局也同样重要。
注意,术语设计(design)有两层意思。第一层意思是对色彩和布局做出选择,这通常由站点的美工人员完成。第二个定义包括站点的智能结构和各个部分之间的协作关系。这包括为信息的体系结构制定计划;作为开发人员,您希望在关系数据库中保存尽可能多的信息。本章专注于第二种定义。下一章介绍怎样混合使用HTML和ASP.NET控件设计站点中的每个页面。
Wrox United示例站点的如下几个总体设计目标是在本章中实现的:
● 在开发过程中尽可能使排查问题变得容易,以便简化追踪错误的过程。
● 设置站点在部署后处理错误的标准。
● 为所有页面创建一致的外观。
注意:
其他总体设计目标将在本书的后续章节中讨论,包括鉴别会员的登录系统界面(第4章)、为站点设置统一的样式和主题风格(第5章)和在数据库或XML数据文件中获得尽可能多的信息(第7和第8章)。
2.2 Master和Content页面
站点具有一致的外观有很多好处,在Internet上很少看到没有统一布局的站点。统一的布局通常包括以下内容:
● 一个公共标题和整个站点的菜单系统。
● 页面左边的导航条,提供一些页面导航选项。
● 提供版权信息的页脚和一个用于联系网管的二级菜单。
这些元素将显示在所有页面上,它们不仅提供了最基本的功能,而且这些元素的统一布局也使得用户意识到他们仍处于同一个站点内。虽然这种外观可以使用在HTML中包含文件的方式创建,但是ASP.NET 2.0通过Master和Content页面机制提供了更强健的工具。
Master页面定义了所有基于该页面的网页使用的布局。它是页面布局的最高控制,指定了每个页面上的标题应该多大、导航功能应该放置在什么位置、以及在每个页面的页脚中应该显示什么内容—— 有些类似每个页面的形状切割插件(cookie cutter)。Master页面包含了一些可用于站点中所有页面的内容,所有可以在这里定义标准的版权页脚,并将站点的主要图标放置在页面的顶部。一旦定义好Master页面的标准特性之后,接下来将添加一些占位符(placeholder)—— 页面上的命名区域,这些区域将包含不同的页面。
每个Content页面都以Master页面为基础,开发人员将在这里为每个页面添加具体的内容。Content页面包含文本、HTML和位于<asp:content>标记内的控件。当关于某个Content页面的请求到达时,该Content页面将和它的Master页面的一个副本组合到一起,由Master页面中特定的占位符包含Content页面的内容。然后完整的页面将发送到浏览器,如图2-1所示。
图 2-1
幸运的是,构造这一体系的重担由ASP.NET 2.0承担;开发人员只需创建下面两个小节中讨论的Master和Content页面即可。
2.2.1 创建Master页面
要创建Master页面,可以在VWD的Solution Explorer中右击根目录,选择Add Item,并将类型指定为Master Page。默认情况下,新Master页面的名称是MasterPage.master,位于站点的根目录中。Master页面由三部分组成。
首先是一些基本的标记(tag)和标志(例如Master页面的标志,DOCTYPE、xmlns、html和head标记),所有已显示出来的页面都会包含这些内容。这些内容在Master页面中只输入一次,以减少重复工作。DOCTYPE和xmlns指示服务器可以从何处查看页面中所使用的标记的定义。注意这些标记不会出现在Content页面中:
<%@ master language="VB" %>
<!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 id="PageHead" runat="server">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta http-equiv="Content-Language" content="en-uk" />
<title>Wrox United</title>
<link rel="stylesheet" type="text/css" href= "site.css" runat="server"
/>
</head>
其次,Master页面中有一个用于存放脚本的区域,这些脚本可以在所有的页面上运行(例如,Page_Load的代码,该事件在页面每次加载的时候都会运行),例如:
<script runat="server">
Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs)
' ...
End Sub
</script>
第三,Master页面包含一些HTML布局、开始/结束标记<asp:content… ContentPlaceHolderID=“xxx”>和</asp:content>。包含在Content页面中的内容将放置在这些标记之间。例如:
<body>
<form id="mainForm" runat="server">
<div id="header">...</div>
<div id="sidebar">...</div>
<div id="content">
<asp:contentplaceholder id="mainContent" runat="server" />
</div>
<div id="footer">
<p class="left">
All content copyright © Wrox Press and its subsidiaries
2004.</p>
</div>
</form>
</body>
</html>
总结一下,每个Master页面都必须包含如下元素:
● 基本的HTML和XML输入标记
● 第一行是<%@master…%>
● 带有ID的<asp:ContentPlaceHolder>标记
现在,Master页面可以作为容器包含其他页面了。下一节中将创建一些Content页面。
2.2.2 创建Content页面
与ASP.NET 2.0一样,VWD也减少了开发人员的输入。在Solution Explorer中,右击根目录并选择Add New Item。通常选择Web Form;Content页面没有特定的模板。注意对话框底部的Select master page(如图2-2所示)复选框。当选中该复选框并单击Add按钮时,VWD将显示另一个对话框,询问为新的Content页面选用哪个Master页面。
图 2-2
在如图2-3所示的对话框中,开发人员可以选中要使用的Master页面。选中Master页面(通常命名为MasterPage.master)并单击OK。
图 2-3
VWD在这个Content页面中设置了两个值。在Design视图中看不到这两个值,但切换到Source视图就可以看到它们,如下面的代码所示。首先,所使用的Master页面将在第一条指令中说明。其次,VWD将在这个页面中放置一个<asp:content>控件,该控件的ID和Master页面中占位符的ID相同。一个Master页面中可能会包含多个可以插入Content页面的位置。指示符表明哪个占位符将由这个特定的页面填充。
<%@ Page Language="VB" MasterPageFile="MyMasterPage.master" %>
<asp:Content ID="Content1"
ContentPlaceHolderID=" Content Place Holder ID in Master Page"
Runat="Server">
... content goes here
</asp:Content>
总结一下,一个Content页面包含如下特性:
● 没有HTML的<!DOCTYPE HTML…>标记和XML的<html xmlns=…>标记
● 第一行的<%@ page MasterPageFile=…%>指示ASP.NET 2.0应使用哪个Master页面
● 包含一个<asp:content>标记
理论上并不难,而且代码由VWD自动添加。在下面的示例中,可以看到Master和Content页面的相互协作。
2.2.3 Master和Content页面的示例
本书中的所有练习基本上都可以在Design视图中完成(不用直接处理代码)。但是切换到Source视图查看VWD如何创建页面是一件很有趣的事情。下面显示的代码是一个公司的Master页面(名为research.master)和一个名为mission statement的Content页面示例。第一行阴影代码指示Master页面,在第二个阴影部分是一个控件,该控件定义了一个内容占位符,Content页面的内容可以插入到这个占位符中:
<%@ Master Language="VB" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server"> <title>CorporateMaster</title></head>
<body>
Corporation Name
<form id="form1" runat="server">
<div>
<asp:contentplaceholder
id="ContentPlaceHolderMissionStatement"
runat="server">
</asp:contentplaceholder>
</div>
</form>
</body>
</html>
下面是该示例中Content页面的代码。灰色部分指示了Master页面和描述插入到Master页面中的内容的控件。ContentPlaceHolder的ID必须匹配Master页面中的ContentPlaceHolder的ID。下面的代码是完整的;页面的顶部不包含其他标记或属性:
<%@ Page Language="VB" MasterPageFile="~/research.master" Title="Untitled Page" %>
<asp:Content ID="Content1"
ContentPlaceHolderID="ContentPlaceHolderMissionStatement"
Runat="Server">
Our Mission Statement is to provide value to the customer.
</asp:Content>
注意Content页面必须包含一组最小化的标记。Content页面中没有<!DOCTYPE>或者<html xmlns=“http://www.w3.org/1999/xhtml”>等标记,也不会包含<head>信息。这些数据由Master页面提供。
2.2.4 在Master页面中使用级联样式表
在Master页面中声明到级联样式表(Cascading Style Sheet,CSS)的链接是一个不错的选择。CSS是HTML的特性,而不是ASP.NET 2.0的特性,所以本书没有深入讨论这个主题。然而,CSS将在第5章中和相关主题一起讨论。在附录E中还有HTML和CSS的简单参考。简而言之,CSS包含了用于页面和控件的各种样式的格式,因此页面在显示时,其上面的所有元素、文本和按钮以及链接的风格等等,都会根据CSS中定义的格式显示。有了CSS,设计人员就可以少用(并维护)很多使用很频繁的单个样式格式标记。CSS还可以加快页面的加载速度,因为CSS在浏览器中只加载一次,当需要重复使用时,可以直接使用保存在客户端缓存中的CSS。在一个Master页面中,应该在<head>部分包含一个类似如下的链接(灰色部分代码)从而将页面和CSS链接在一起:
<head id="PageHead" runat="server">
<title>Wrox United</title>
<link rel="stylesheet" type="text/css" href="MySite.css"
runat="server" />
</head>
在下面的“试一试”部分,您将有机会创建Wrox United站点的Master页面。在本书每一章的练习中,您都将为站点添加内容和功能。现在只需要简单地创建Master页面的架构。在本书的后续章节中将为Master页面添加其他部分,所以现在该文件看起来还不是很完整,暂时不用关注这个问题!
(1) 打开本章的示例站点,目录是C:/BegASPNET2/Chapters/Begin/Chapter02。首先导入一个作者创建的CSS文件。右击站点的根目录并选择Add Existing Item,如图2-4所示。
图 2-4
(2) 导航到存放本书下载文件的文件夹(C:/BegASPNET2/WroxUnited),选择site.css并单击Add。CSS是HTML的主题(不是ASP.NET的),但是如果打开该文件,将可以看到为HTML编写的样式集,例如<h1>、<h2>等。不必修改该文件。可以看到在Solution Explorer内显示的文件列表中已经包含了文件site.css。如果打开了这个CSS文件,请关闭它。
(3) 再次右击根目录,但这次选择Add New Item并使用Master Page模板。将该页面命名为site.master。确保Select master page复选框没有选中(这个选项只用于Content页面)。在VWD创建该页面之后可以在Design视图中查看它,不过现在它是一个空页面。注意,在Source视图中可以看到VWD已经添加了几个标记和控件(查看如下代码)。第一个标记是一个指示符,表明这是一个Master页面,而第二个标记是普通的文档类型指示符。接下来是一个插入脚本代码的位置,然后是一个XMLNS值。可以看到,VWD在<body>标记内创建了一个contentplaceholder控件:
<%@ master language="VB" debug="true" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<script runat="server">
</script>
<html xmlns="http://www.w3.org/1999/xhtml">
<head id="PageHead" runat="server"> ... </head>
<body>
<form id="Form1" runat="server">
<div>
<asp:contentplaceholder id="mainContent" runat="server" />
<div>
</form>
</body>
</html>
(4) 可以修改表单(form)的名称,把由VWD产生的普通名称修改为更适合自己情况的名称。切换到Source视图并将<form id=“form1”runat=“server”>修改为<form id=“MainForm”runat=“server”>。
(5) 切换到Design视图设置样式表。在Properties窗口的顶端,打开控件下拉列表并选择Document。在属性列表的底部找到Style Sheet(如图2-5所示),单击椭圆形的按钮,并找到site.css。单击OK。
图 2-5
(6) 添加<div>标记分隔页面可以简化页面格式的修改。创建的Master页面将在<form>内使用4个<div>区域。有些区域中会包含其他<div>标记(子层次结构的<div>)。第一个<div>是由VWD自动创建的;其他的需手动添加。可以从工具箱的HTML面板中将<div>拖放到页面上,但是在Design视图中很难将其放到正确的位置上。您可以使用Source视图进行精确定位。
(7) 切换到Source视图并在窗体内找到默认的<div>。从<div>标记的开头到</div>标记的末尾都选中,可以注意到Properties窗口中现在显示的是<div>的属性。将id属性设置为content。
(8) 继续停留在Source视图中,通过拖放将另一个<div>从工具箱的HTML面板中拖放到<div id=“content”>的上方,但仍然在<form>内。将其id属性设置为header。
(9) 在表单内另外添加两个<div>标记。将标题下面的第一个<div>的id设置为sidebar,并将最下面的那个<div>的id设置为footer。
(10) 在Source视图中,现在创建子层次结构的<div>标记,这些标记将位于前面创建的<div>内部。在header<div>内,拖放一个<div>并将其id设置为logo。在logo <div>的后面将显示一些简单的文本,如下所示:
<form id="mainForm" runat="server">
<div id="header">
<div id="logo"></div>
<h1>Wrox United</h1>
</div>
(11) 在sidebar<div>中添加文本Navigation,如下面的代码所示:
<div id="sidebar">
<h3>Navigation</h3>
</div>
(12) 在后面几个章节中将在content<div>内添加控件,但现在,只添加一个class为itemcontent的子层次结构<div class=>:
<div id="content">
<div class="itemContent">
<asp:contentplaceholder id="mainContent" runat="server" />
</div>
</div>
(13) 在footer<div>中添加两个版权信息:
<div id="footer">
<p class="left">
All images and content copyright © Wrox Press and its subsidiaries
2004.
</p>
<p class="right">
Website designed by
<a href="http://www.frogboxdesign.co.uk" title="croak">Frog Box
Design</a>
</p>
</div>
</form>
操作回顾
首先为站点导入一个CSS文件,这个文件是由作者创建好的,包含在本书的下载代码中(实际上,作者并不善于设计。我们觉得红色、粉红色和橙红色组合在一起比较合适,所以我们邀请Frog Box Design的一位设计师对示例站点进行设计)。由于CSS是HTML的技术,因此在这里没有讨论样式表的结构(详细内容可以参考附录E)。
然而,更重要的目标是使用VWD帮助创建一个Master页面,这个页面包含3个基本组成部分。通过使用Master Page模板,VWD为您创建了基本的HTML和XML输入标记。VWD还在第一行添加了<%@master…%>。最后,VWD提供了一个<div>,该<div>中包含了一个<asp:ContentPlaceHolder>标记。每个占位符标记都需要一个ID,因此可以将该标记的ID修改为有意义的名称。
然后对Master页面做了一些基本的修改,使它能支持本书后续章节将要添加的功能。所有这些内容其实都是HTML的功能,而不是ASP.NET 2.0的。首先,使用VWD的IntelliSense工具为要导入的CSS文件添加一个链接。然后创建了几个<div>标记,以便在标题区、边条(sidebar)、内容区和脚本区组织页面的内容。
下面的“试一试”部分将创建一个Content页面,这个页面用于填充site.master页面中的占位符。由于“about the site”页面很简单,所以先从创建该页面开始介绍。
(1) 在VWD中打开Wrox United站点,右击根目录。选择Add New Item并选中Web Form模板。将该页面命名为About.aspx并确保同时选中Select a master page和Place code in separate file两个复选框,如图2-6所示,即使该页面没有任何代码(如果没有为代码指定一个单独的文件,那么代码的架构标记(framework tag)就将出现在.aspx文件中。最好和站点的其他页面保持统一,将容器标记和代码分别保存在不同的文件中)。
图 2-6
(2) 在第二个对话框中,选择site.master作为Master页面并单击OK,如图2-7所示。
图 2-7
(3) 在Design视图中,输入几行文本,如下所示:
The site was initially written by Dave,while design & graphics were done by Lou.
Conformance is XHTML 1.0 Transitional and CSS 2.1.
(4) 在这里可以体验到VWD对创建非ASP标记的辅助作用,例如创建超链接。在Design视图中,打开工具箱的Standard面板并找到Hyperlink控件,将其拖放到前面代码的第一行结尾处。在属性窗口中将text属性设置为Frog Box Design,将NavigationURL属性设置为www.frogboxdesign.co.uk。VWD将自动检查输入的属性值以创建该链接。
(5) 在Design视图中查看该页面,可以注意到,Master页面已经出现在页面架构中,而Content页面内只有您输入的文本。切换到Source视图,可以注意到这个About页面指定了它的Master页面,而它的内容将插入到mainContent占位符中。
操作回顾
创建页面时,首先要在Solution Explorer中选择页面的父文件夹。在很多情况下,该文件夹是Web站点的根目录C:/BegASPNET2/WroxUnited,但有时可能是一个层次结构较低的文件夹,例如FanClub.aspx就存放在文件夹C:/BegASPNET2/WroxUnited/FanClub中。
Content页面是如何获得与site.master页面相互协作的3个功能的呢?起始标记<%@Page…>必须包含MasterPageFile属性。由于可能将这些文件移动到不同的文件夹结构中,可以使用波浪号(~)引用Master页面的位置,这个符号表明Master页面位于根目录下。其次,Content页面的内容包含在ASP.NET服务器端控件asp:Content中,这个控件的ContentPlaceHolderID属性指示将Content页面的内容插入到Master页面的什么位置。再次,因为HTML和XMLNS标记由Master页面引入,所以在Content页面中省略了这些标记。
Master和Content页面机制还有其他一些功能,虽然这些功能在Wrox United示例站点中没有实现,但是多层次的Master页面可以用于一个最终页面。根据发出请求的浏览器不同,可以使用不同的Master页面。一个Master页面可以支持多个内容占位符。
2.3.1 多层次的Master页面
虽然这种技术没有用于Wrox United站点,但是页面可以继承多层次的Master页面。这个功能提供了一种显示多层次结构标准内容的方式。例如,一个名为Publication.aspx的Content页面可以指定它的Master页面为Research.master,而Research.master又指定它的Master页面为Corporate.master。最终显示的结果是,Publication.aspx包含在Research.master内,而Research.master页面又包含在Corporate.master内。这样做的一个问题是用于显示内容的空间将随着层次结构的增加而不断减少。VWD没有包含用于创建多层次Master的自动工具。事实上,如果包含了多个层次,那么只能在Source视图中打开页面。
要创建带有多层次Master的页面,必须在中间层页面中包含标记同时指明该页面的Master页面(上一个层)和内容占位符(为下一层页面提供)。回忆一下,在Master页面的第一行代码中必须包含<%@master…>,而在低一层的页面或者Content页面的第一行代码中必须包含<%@ page masterPageFile=%>。如果是中间页面,它即是Content又是Master,那么第一行的标记必须以<%@master…开始,同时包含…masterPageFile=%>。
Master页面包含了一个<asp:ContentPlaceHolder>标记,而Content页面则包含了一个<asp:content>标记。如果是中间层页面,那么它必须包含一个<asp:content>标记,该标记与Master页面中的<asp:ContentPlaceHolder>标记相关联。然后在这个标记中有一个<asp:ContentPlaceHolder>标记,该标记用于包含下一层的页面。
下面的示例演示了一个Corporate Master页面、一个Research department Master页面和最终包含具体内容的Publication.aspx页面。下面的代码显示了Corporate页面。注意它的内容占位符是在阴影部分定义的:
<%@ Master Language="VB" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title>CorporateMaster</title>
</head>
<body>
Corporation Name
<form id="form1" runat="server">
<div>
<asp:contentplaceholder
id="ContentPlaceHolderCorporate"
runat="server">
</asp:contentplaceholder>
</div>
</form>
</body>
</html>
下面的代码演示了Research department Master页面。这个页面最复杂,因为它既是Corporate页面的Content页面,同时也是Publication页面的Master页面。注意在第一行代码中,Master和MasterPageFile=将该页面设置为Corporate Master页面的内容。然后可以注意到<asp:ContentPlaceHolder>将其他页面作为自己的内容(在这里是Publication页面)。内容占位符必须全部包含在<asp:content>标记之内:
<%@ Master MasterPageFile="~/Corporate.master" Language="VB" %>
<asp:Content runat="server"
ContentPlaceHolderID="ContentPlaceHolderCorporate">
Research Department
<asp:contentplaceholder
id="ContentPlaceHolderResearch"
runat="server">
</asp:contentplaceholder>
</asp:Content>
下面显示的是Publication.aspx页面的代码(其中只包含了网页的具体内容)。在此只需指定Master页面。这个页面不是Master页面,它位于最底层:
<%@ Page Language="VB"MasterPageFile="~/Research.master"Title="Untitled Page" %>
<asp:Content ID="Content1"
ContentPlaceHolderID="ContentPlaceHolderResearch"
Runat="Server">
Publication text
</asp:Content>
2.3.2 Master页面支持多个内容占位符
到目前为止,本书的示例在Master页面中只使用了一个<asp: ContentPlaceHolder>,在Content页面中也只使用了一个<asp:content>标记。ASP.NET 2.0支持多个内容占位符。但是,每个占位符都必须有自己的ID,如下例所示:
<%@ Master Language="VB" %>
<html><body>
<form id="form1" runat="server">
<asp:contentplaceholder runat="server" id="TopContent" />
<asp:contentplaceholder runat="server" id="MiddleContent" />
<asp:contentplaceholder runat="server" id="BottomContent" />
</form>
</body></html>
接下来就可以将内容包含在<asp:content>标记中,这些标记的ContentPlaceHolderID值与Master页面中的ID值相等:
<%@ Page Language="VB"MasterPageFile="~/research.master"Title="Untitled Page"%>
<asp:Content ID="Content1" ContentPlaceHolderID="TopContent" Runat="Server">
Text to go in Top section
</asp:Content>
<asp:Content ID="Content1" ContentPlaceHolderID="MiddleContent" Runat="Server">
Text to go in Middle section
</asp:Content>
<asp:Content ID="Content1"ContentPlaceHolderID="BottomContent"Runat="Server">
Text to go in Bottom section
</asp:Content>
将内容分别存放在不同的<asp:ContentPlaceHolder>标记中有助于设计和维护Master页面的布局。
为了使用ASP.NET 2.0的导航功能,必须有一种标准的方法描述站点中的每个页面。这个标准不仅包含每个网页的名称,还应该能够表明它们的层次结构关系。例如,显示球员统计数据的页面应该是显示球员列表页面的子页面,而该页面又是主页的子页面:
Home
- Players
-- Player Statistics
定义这样的层次结构在站点设计中是一个很重要的部分,因为开发人员希望知道(在开始编写代码之前)需要开发什么页面、在不同的页面上应给用户提供哪些链接、以及用户在查看了一个特定的页面之后可能会浏览其他什么页面。画出站点的树型目录,就像上面的简单示例那样,这是必须采取的第一个步骤。然后可以进行下一个步骤,在代码中定义这个层次结构。
ASP.NET 2.0在一个名为web.sitemap的XML文件中包含这些信息。可以将这个文件作为菜单和导航控件的数据来源,这一内容将在第3章讨论。
提示:
Microsoft在ASP.NET 2.0中所提供的是一种在菜单和导航控件中使用站点数据的方式,前提是这些数据要遵守web.sitemap标准。VWD为web.sitemap文件提供了一个模板,该模板中包含了web.sitemap文件所需的标记。但在写作本书的时候,还没有工具可以扫描站点并生成存放在这些标记中的实际数据。第三方工具将填补这个空隙,但现在必须手动将这些信息输入到web.sitemap文件中。
站点地图必须是一个名为web.sitemap的XML文件,而且位于Web应用程序的根目录下。XML是一种保存数据的标准,有些类似于数据库,但以一种肉眼可以阅读的文本形式存放数据。每个数据项保存在一个节点中,其中节点表示站点的一个页面,包含页面的URL、标题和描述。XML文件以树型结构保存节点,因此ASP.NET 2.0知道哪些页面应看作是某个父页面的子页面。例如,Corporate Departments页面应该是显示Sales、Research和Accounting各部门详细信息页面的父页面。该文件中的第一个标记是标准的,用于让XML文件标识版本号和XMLNS,如下代码所示:
<?xml version="1.0" encoding="utf-8" ?>
<siteMap xmlns="http://schemas.microsoft.com/AspNet/SiteMap-File-1.0" >
这两行代码是由开发人员在VWD中使用站点地图模板添加该文件时由VWD自动输入的。节点的名称很简单:<siteMap>,该标记包含了多个<siteMapNode>标记。每个标记代表一个网页,而且可以包含以下属性(<siteMapNode>标记的所有属性都是字符串):
● Title:描述页面(这与页面头部的<Title>标记没有任何联系,虽然它们的值可以相同)。
● URL:节点中描述的页面位置。
● Description:该页面的描述。
注意在一个URL中可以包含querystring数据,这是定义在页面URL之后的附加信息,作为页面请求的一部分发送给服务器。例如,通常引用一个页面的方式应该类似下面的第一行代码,而附带数据引用一个页面(例如,在日历中显示的月份)的方式将类似于下面的第三行代码:
url="Calendar.aspx"
url="Calendar.aspx?Month=May"
站点地图中页面之间的层次结构关系(父/子关系)是通过将子节点包含在父节点的开标记和闭标记之间建立起来的。注意在下面的代码中两个子页面(Members和Calendar)是如何包含在Home页面的开和闭标记(灰色背景显示)内的。缩进只是为了便于阅读;并不会影响实际的层次结构关系。注意表示子页面(Members和Calendar)的标记可以使用单标记形式<Tag…/>。但是由于父页面(Home)拥有子页面(它包含其他节点),因此它必须使用双标记形式<Tag>…</Tag>:
<siteMap>
<siteMapNode title="Home"url="Default.aspx"description="Home page for MySite">
<siteMapNode title="Members"url="Members.aspx"description="All Members"/>
<siteMapNode title="Calendar"url="Calendar.aspx"description="Club Events"/>
</siteMapNode>
</siteMap>
为了在Calendar节点内创建两个子页面(Home页面的子页面),需要采取两个步骤。首先,将表示Calendar的<siteMapNode>转换成双标记形式,然后在这个标记的内部添加两个子标记,如下面代码的灰色部分所示。记住,如前所述,必须在web.sitemap文件的Source视图中手动完成输入。VWD既没有提供可以执行自动扫描和生成数据的工具,也没有提供从Solution Explorer到web.sitemap文件的拖放功能。
<siteMap>
<siteMapNode title="Home"url="Default.aspx"description="Home page for MySite">
<siteMapNode title="Members" url="Members.aspx" description="All Members" />
<siteMapNode title="Calendar" url="Calendar.aspx" description="Club Events">
<siteMapNode title="Calendar of Racing Events"
url="Calendar/Racing.aspx" description="Racing Events" />
<siteMapNode title="Calendar of Social Events"
url="Calendar/Social.aspx" description="Social Events" />
</siteMapNode>
</siteMapNode>
</siteMap>
注意在<SiteMapNode>节点中可以指定另一个属性:roles。在第11章将看到,在Wrox United示例的站点地图文件中用到了这个属性。在有些情况下,开发人员可能希望让用户知道某个页面的存在,即使该用户没有访问这个页面的权限。以这种方式,可以向用户提供一个链接,但当用户单击这个链接的时候,站点将提示他先以拥有足够权限的用户身份进行登录,然后才能查看这个页面。
在下一个“试一试”部分,将为Wrox United创建web.sitemap。在下一章中才能看到这个练习的结果,在那里将学习导航控件的概念。但这个步骤是将站点结构的纸上设计转入到代码的一种方式,所以正确地完成它是很重要的。
(1) 在Solution Explorer中右击根目录并选择Add New Item。选择名为Site Map的模板并将该文件命名为web.sitemap。注意VWD自动添加了前两个标记并给出了3个节点的架构。第一个是最高层次(Home),其他两个是子层次。
(2) 用下面的代码修改第一个<siteMapNode>,使其表示Home页面:
<siteMapNode title="Home"url="Default.aspx"description="Wrox United Home Page">
(3) 修改下一个<siteMapNode>(第一个子节点):
<siteMapNode title="Fixtures" url="Fixtures.aspx" description="Match Fixtures">
(4) 将整个空白<siteMapNode>复制到剪切板以便粘贴它,而不必重复输入该标记。
(5) 为Fixtures节点创建两个子节点,如下面的灰色代码所示:
<siteMapNode title="Fixtures" url="Fixtures.aspx" description="Match Fixtures">
<siteMapNode title="Future Fixtures"
url="Fixtures.aspx?type=future"
description="Who we're going to be playing" />
<siteMapNode title="Past Fixtures"
url="Fixtures.aspx?type=past"
description="Who we've already played" />
</siteMapNode>
(6) 要完成这个示例,还需添加一定数量的节点,所以为了节约时间,我们将其他节点包含在本章目录(C:/BegASPNET2/Chapters/begin/Chapter02)下一个名为web.sitemap.remainder的文件中。您所需做的就是在Notepad中打开这个文件,复制该文件的所有内容,并将其粘贴到您所创建的文件的底部。另一种选择是,导入作者创建的web.sitemap文件。
(7) 暂时无法测试web.sitemap文件,因为显示这些数据的控件要在第3章中才讨论,但理解这个基础是很重要的,因为可以使用它为站点添加导航功能。
操作回顾
在这个练习中创建一个站点地图文件。VWD没有包含可以自动创建该文件的工具,但包含了一个简单的模板,该模板提供一些标记作为工作的起点。该文件只有命名为web.sitemap才能为ASP.NET 2.0使用,所以不要试图改变该文件的名称。
添加一个新的站点地图模板并切换到Source视图。VWD添加了起始标记和第一个节点的标记。但接下来必须手动输入所有数据,并开始为其他页面及其数据复制和粘贴标记。显然,编写程序自动实现这个任务的第三方软件将会很畅销!
在开始设计任何Web站点之前,回顾一下优秀站点设计的原则是很有益的。在本书中,应该记住三个基本概念:
● 尽量将信息与其表示分隔开。例如,开发人员将设计页面的标题、布局和格式(表示)。在页面上,开发人员将放置配置好的控件以获取和显示信息(例如球队的球员列表)。通过将这些目标分隔开,开发人员可以分别对每个部分进行更新而不会影响到其他部分。例如,当球队增加了一名新球员时,关于该球员的信息将保存在数据库中,页面将自动显示新的球员列表而无需修改表示层。
● 尽量保证站点具有一致的外观。通过使用相同的色彩、图标和屏幕布局,可以为用户创建一种临场感(sense of presence)。忠实的球迷一看到这种色彩就感觉像到了家一样。回访用户可以利用已经掌握的经验使用该站点。
● 尽量简化站点导航。首先,所有页面上的菜单条将简化从站点的一个部分跳转到另一个部分的导航。用户还将使用ASP.NET 2.0工具显示当前正在查看的页面位于站点中的什么位置。
ASP.NET 2.0使用两个文件保存用于整个站点的配置信息和代码,这一点所有ASP.NET站点都是一样的。这两个文件分别是Web.config和Global.asax。
● Web.config包含站点的配置信息;例如,指定一个定制的标准错误页面,当站点内发生错误时,向终端用户显示这个页面。
● Global.asax包含处理事件的代码,这些事件由站点的任意页面产生;例如,当用户第一次访问站点时运行的代码(会话初始化)。
2.6.1 Web.config包含整个站点的设置
Web.config包含用于整个站点的值。它是一个XML文件,位于根目录下,其节点主要包含3个方面的信息:
● 应用程序配置,用于设置在开发阶段或部署之后可以使用的功能。
● 连接字符串,用于从数据源读取数据或向数据源写入数据时连接数据源。
● System.Web和System.Net设置,包含其他所有信息。
System.Web设置又可以分为很多子类型,包括(WroxUnited没有全部用到)如下几种:
● HTTP Module,将页面指向其他页面以便执行代码
● 调试例程,在编译时应该启动这些例程
● 身份验证技术
● 角色管理器,打开或者关闭
● 匿名识别,允许或拒绝
● 错误处理设置
● SiteMap文件数据,用于导航和菜单
● Profile数据,用于标识用户
● 针对Simplified Mail Transfer Protocol(SMTP,简单邮件传输协议)的电子邮件设置(在WroxUnited中没有用到)
● 命名空间的定义,标识对象在更大的对象内部处于什么位置(在WroxUnited中没有用到)
System.net只包含完成一个目标的设置,一组用于发送电子邮件的值。
有两种方式修改这个文件的内容;第一种是在VWD手动编辑该文件,幸运的是,这样做并不是很复杂。另一种方式是使用ASP.NET Web Site Administration Tool,可以在VWD中启动这个工具。在VWD的主菜单中选择Website->ASP.NET Configuration。一系列的对话框使得开发人员可以设置很多值,VWD将根据这些值修改Web.config文件而不用直接打开它。
下面关于Web.config文件结构的解释是以Wrox United站点的Web.config文件为例,从其顶部开始向下查看各个部分。如果打开该文件,则可以看到它的结构(带有开标记和闭标记,每个标记都有属性,有些还包含了子节点)和其他XML文件的结构是一样的。通过添加恰当的节点和属性,可以设置应用程序级别的配置。包含在特殊字符串<!--和-->之间的文本被看作是注释,可以添加注释帮助其他用户理解文件每个部分的用途。
注意:
在VWD创建Web.config文件时,它将在其中包含很多注释,以便为每个部分的设置提供参考值。所有这些值包含在一个文本文件中,该文件位于C:/Windows/Microsoft.NET/
Framework/v2.xxx/CONFIG/Web.config.comments。
下面是Wrox United站点的Web.config文件的开始部分,如您在下载文件中所见。可以导入该文件以替换创建的站点中的默认Web.config文件:
<?xml version="1.0"?>
<!-- Note: As an alternative to hand editing this file you can use the web
admintool to configure settings for your application. Use the Website->
Asp.Net Configuration option in Visual Studio.A full list of settings and
comments can be found in machine.config.commentsusually located in /Windows/
Microsoft.Net/Frameworks/v2.x/Config -->
<configuration xmlns="http://schemas.microsoft.com
/.NetConfiguration/v2.0">
所有新的Web.config文件中默认都添加了3行代码。第一行包含了XML声明,指出Web.config文件遵守XML标准。下一个区域是一个很长的注释,提醒您可以使用管理工具而不是手动编辑代码。最后一个需要提及的内容是文件的根节点;<configuration>节点将包含所有子节点,这些子节点包含了与存储在站点中的内容相关的配置。
下一部分包含一个客户应用程序设置,在修改示例应用程序位于不同环境下的运行方式时这个设置很有用。<!--和-->之间的内容是VWD为程序员提供的注释,不是实际设置的一部分。
<!--
Mode defines certain feature availability:
Full: No restrictions
Real: Runs as if a real site, without the view code and download links
-->
<appSettings>
<add key="mode" value="Full" />
</appSettings>
下一部分,即连接字符串部分,包含了与数据源相关的信息。这个字符串通常包含了身份验证信息,开发人员可以使用这个信息将代码与保存在数据库中的数据连接起来。第7章将详细讨论连接字符串。目前只需注意到在连接字符串部分可以有一个或多个添加字符串的标记:
<!--
define the connection string to the database
-->
<connectionStrings>
<add name="WroxUnited"
connectionString="Data Source=./SQLEXPRESS;
AttachDbFilename=|DataDirectory|WroxUnited.mdf;
Integrated Security=True;User Instance=True"/>
</connectionStrings>
注意connectionString属性的字符串值有换行,这是由于页面宽度所限。在实际情况下,这些代码应该位于同一行上。
在连接字符串之后,其他设置都位于<system.web>标记内。这些设置可以按照任意顺序排列;下面首先讨论httpModules设置。这个值使得站点可以集中处理用户所选择的主题风格,而不需要在页面中添加代码。第5章讨论主题风格,虽然这里没有详细讨论HttpModule,但代码的注释是很到位的。
<system.web>
<httpModules>
<add name="Page" type="Wrox.Web.GlobalEvents.ThemeModule" />
</httpModules>
接下来在System.Web内的是编译(compilation)值。如果将其设置为true(如下例所示),则ASP.NET 2.0将把在编译页面期间发现的问题都输出到该页面上。这个功能在开发站点时很有用,但在部署站点之前应将其设置为false:
<system.web>
<compilation debug="true">
</compilation>
Wrox United声明了3个站点级别的安全设置:身份验证、角色和配置文件。第4章和第11章将详细讨论这3个功能。下面显示的Web.config片断让您预览一下将要学习编写的内容。注意这些设置是如何为用户指定登录页面(Default.aspx)并打开角色管理器(Role Manager)的。这些内容同样也将在第4章和第11章中详细讨论。为了节省篇幅,下面的代码没有列出VWD为程序员提供的注释。另外,在WroxUnited站点的web.config文件的第二部分和第三部分设置之间有一个中断,其中插入的是其他设置。
<authentication mode="Forms">
<forms loginUrl="Default.aspx"></forms>
</authentication>
<roleManager enabled="true"/>
<anonymousIdentification enabled="true"/>
...
<profile enabled="true">
<properties>
<add name="MemberName"/>
<add name="Name"/>
...
<add name="Cart" serializeAs="Binary" type="
Wrox.Commerce.ShoppingCart"
allowAnonymous="true"/>
</properties>
</profile>
下一个要查看的部分与错误处理有关,错误处理能够影响站点的日常运行。第15章将详细讨论错误处理,但这里简单介绍一下,可以设置ASP.NET在出现问题时将用户重定向到一个定制的错误页面。出现错误时所显示的页面由Web.config文件中的defaultRedirect设置指定,如下所示:
<!-- The <customErrors> section enables configuration of what to do if/when
an
unhandled error occurs during the execution of a request. Specifically, it
enables developers to configure html error pages to be displayed in place
of a error
stack trace. -->
<customErrors mode="RemoteOnly">
<error statusCode="404" redirect="missingPage.aspx"/>
</customErrors>
因此,例如,如果数据库服务器因为掉电而关闭,站点的用户并不需要知道这个详细信息,但他们希望问题尽快解决,所以向他们显示“对不起,站点出现一个问题—— 我们正努力排查。服务将很快恢复正常”这样的信息就足够了。而本地管理员则需要知道出了什么问题,以便对其进行处理并尽快恢复运行!这个示例中的RemoteOnly属性表示远程用户看到的是友好页面,而管理员看到的则是错误的详细信息。
System.Web的最后一部分设置指定包含站点地图的文件,站点地图是所有页面的一个索引,同时它表明各个页面之间的关系。ASP.NET 2.0还需要指定用于站点地图的提供商或阅读工具。
<!-- Redefine the Site Map Provider, to add the security trimming
attribute,
which is off by default -->
<siteMap defaultProvider="AspXmlSiteMapProvider" enabled="true">
<providers>
<clear/>
<add name="AspXmlSiteMapProvider"
type="System.Web.XmlSiteMapProvider,
System.Web,
Version=2.0.3600.0,
Culture=neutral,
PublicKeyToken=b03f5f7f11d50a3a"
siteMapFile="web.sitemap"
securityTrimmingEnabled="true"/>
</providers>
</siteMap>
最后一组设置位于system.net内。虽然在WroxUnited应用程序中没有显式用到这些设置,但可以使用它们在用户忘记口令并请求通过电子邮件将口令发送给用户本人的时候发送自动产生的电子邮件。无论电子邮件是怎么产生的,开发人员必须以如下方式在Web.config中声明SMTP(Simplified Mail Transfer Protocol,简单邮件传输协议):
<system.net>
<mailSettings>
<!-- these settings define the mail server settings from: the user name
from which the email is sent - this is the application that is sending
the message host:the name of your mail server userName: the name the
application will use to loginto the mail server password: the password
for the above user name
-->
<smtp from="admin@your-domain.com">
<network host="your-mail-server-name"
userName="your-user-name"
password="your-password" />
</smtp>
</mailSettings>
</system.net>
最后,和所有的XML文件一样,每个开标记都有一个对应的闭标记,所以该文件以如下代码作为结束:
</system.web>
</configuration>
Web.config包含了站点级别的设置,所有其他页面都可以参考这些设置。这使得开发人员可以免于在每个需要这些设置的文件中重复设置相同的信息,而且只需在一个地方进行修改。
在本书的后续部分,将为站点的页面添加更多的功能,包括添加处理各种事件的代码,每个页面都会产生这些事件。但是,与开发人员不愿意在每个页面中指定相同的设置一样,如果需要使多个页面具有相同的行为,那就需要找到一种共享代码的方式。在Web.config中没有可执行的代码—— 因此需要另一个站点级别的文件—— Global.asax文件。
2.6.2 Global.asax包含整个站点都可以使用的代码
Web.config中包含的是值,而Global.asax中包含的是代码。与Web.config一样,Global.asax也位于站点的根目录下。编写代码将在第9章详细讨论,但现在可以大致了解一下Global.asax。
Global.asax中的代码将在以下三种情况之一发生时执行。第一种情况是应用程序作为一个整体启动或关闭的时候。第二种情况是当每个用户开始或停止使用站点的时候。第三种情况是响应单个页面可能发生的特殊事件,例如用户登录或错误出现。这些都称为事件。当这些事件中的某一个发生时,ASP.NET将通知Global.asax,通过编辑Global.asax,开发人员可以把对事件做出响应的代码放在其中,在事件发生时,对应的代码将会执行。
在本书的后续章节中,将使用Global.asax在Wrox United Web站点的所有页面之间共享代码。
2.6.3 通过Web浏览器编辑站点配置
现在,查看Web.config文件中复杂的XML语法或Global.asax中的代码可能是一件令人沮丧的事情。编辑这些文件以修改应用程序的总体配置和行为需要很好地理解这些文件的语法规则,并且要确保输入正确以免引入细小的错误。然而,方便的是,通过Web Site Properties对话框,ASP.NET 2.0提供了一个图形化的工具,让开发人员修改很多可以手动输入到Web.config中的设置。
可以通过单击Solution Explorer窗口顶部的ASP.NET Configuration按钮打开Web Site Administration Tool,如图2-8所示。
图 2-8
在图2-9中,可以看到打开的Properties窗口。
图 2-9
VWD实际上打开了一个Web浏览器,其中显示了一个内建于ASP.NET的Web站点,称为ASP.NET Administration Tool,通过它可以编辑Web应用程序的设置。在本书的后续章节中您将深入使用这个管理工具,但现在,可以查看一下这个工具的Application Configuration部分。图2-10显示了这个页面提供的选项。
图 2-10
虽然不能管理前面提到过的所有配置信息,但这里显示了Web.config中的一些关键部分。开发人员可以编辑应用程序设置(<appSettings>元素的内容)、电子邮件设置(<smtpMail>部分)以及调试和错误处理(<compilation>和<customErrors>部分)。
在这个“试一试”部分,将看到ASP.NET Administration Tool是如何编辑Web.config文件的。
(1) 在VWD的Solution Explorer中,将下载文件(C:/BegASPNET2/WroxUnited)中的missingPage.aspx导入站点。
(2) 单击Solution Explorer顶部的图标,打开Web Site Administration Tool。
(3) 导航到Application Configuration页面,单击Define Default Error Page链接。
(4) 选择“Specify a URL to use as the default error page”,并选择MissingPage.aspx作为错误发生时重定向用户的页面。
(5) 单击Save按钮。
(6) 返回到VWD,打开Web.config文件。
(7) 向下滚动直到找到<customErrors>部分,注意defaultRedirect属性的值已经变为在管理工具中所选页面的路径:
<customErrors mode="RemoteOnly" defaultRedirect="MissingPage.aspx">
</customErrors>
操作回顾
这个管理工具只是编辑Web.config中的部分设置的一个比较友好的方法。在使用这个管理工具修改应用程序的错误处理设置的时候,它将编辑Web.config文件—— 而不用开发人员手动编辑XML数据!
既然已经知道站点设计需要包含哪些内容,下面将列出几个在使用Master页面、以及其他在本章中查看过的实用工具时最常见的错误:
● 在Content页面中对Master页面的引用拼写有误。这使得ASP.NET无法找到Master页面模板。要避免这个错误,无论何时只要有可能,尽量使用VWD模板对话框上的复选框创建对某个Master页面的引用。
● Master页面中内容占位符的ID与Content页面中content标记的ContentPlaceHolderID属性的值不匹配,这将使得页面不能正确显示。仔细检查以确保这两个值匹配。
● Web.config或Global.asax文件中的输入错误。这两个文件对语法的要求非常严格,而且其中的错误很难跟踪。可以使用ASP.NET Administration Tool以免手动编辑Web.config,这样可以确保不会在这个文件中引入输入错误。
如果Web站点设计得当,那么创建、使用和维护它都比较容易。ASP.NET 2.0提供了几个用于组织站点设计的工具。
在本章中,您学习了Master和Content页面机制,这种机制能为站点创建一致的外观。Master页面提供了一致的布局,并在页面上留出一部分空间用于显示包含在Content页面中的内容。无论何时只要有可能,尽量通过在Solution Explorer中右击根目录然后选择Add New Item的方式创建Master和Content页面。Master页面中必须包含普通的HTML和XML输入标记、第一行代码一定是<%@master…%>、以及包含一个带有ID的<asp:ContentPlaceHolder>标记。Content页面绝对不能包含基本的HTML和XML输入标记、第一行代码肯定是<%@page masterPageFile= %>、以及在某个位置必须使用<asp:content>标记包含需要显示的内容。如果使用CSS,那么可以在Master页面的<head>部分添加该文件的链接。另外,本章还讨论了以下内容:
● 在站点中可以实现多层次的Master页面。还可以根据发出请求的浏览器不同而选择使用不同的Master页面。而且,一个Master页面可以支持多个<asp:contentPlaceHolder>标记,只要这些标记的ID属性互不相同。
● 站点地图包含了所有文件的描述以及每个文件与其附近文件的关系。ASP.NET 2.0的服务器端控件可以读取这个XML文件从而创建导航菜单。VWD不能自动创建站点地图,但是这个XML结构理解起来并不困难,因为每个页面就是一个SiteMapNode。
● Web.config和Global.asax文件包含了用于整个站点的信息。其中Web.config包含了一系列的设置,例如用于数据源的连接字符串、用于编译的调试例程、安全设置、处理错误的设置,以及其他设置。Global.asax包含用于整个站点的代码,包括当站点作为一个整体启动或关闭时运行的代码。其他代码块可以在每个用户开始或停止使用站点的时候执行。Global.asax还包含了可以在所有页面上执行的代码。
在下一章中,将学习各种各样的服务器端控件以及怎样使用它们创建正确的页面,还将构造Wrox United的主页并填充在本章中创建的Master页面。
(1) 描述Web.config文件和Global.asax在功能上的差异。
(2) 本章讨论的哪些文件是XML格式的?
(3) 查看一个Content页面的代码。它为什么没有如下所示的指令和标记?
<!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 ></head>
(4) 在Master和Content页面之间,哪些值必须相互匹配?