【Asp.net精品源码栏目提醒】:网学会员,鉴于大家对Asp.net精品源码十分关注,论文会员在此为大家搜集整理了“【精品】第12章母版页 - 大学课件”一文,供大家参考学习!
第 11 章母版页 为了给访问者一致的感受,每个网站都需要具有统一的风格和布局。
在 ASP 技术盛行时期,开发人员习惯于使用包含页面的方法,即使用#include 命令,将事先设计好的页面包含到主页面中。
纵览以上两种方法,虽然页面包含和用户控件都能够实现使网站一致性的要求,然而,二者都不是开发技术的内建方法。
也就是说,需要开发人员自己套用,才能够享受利用模板设计网页的好处。
ASP.NET 2.0 技术提出一个新功能一一母版页。
设计母版页的目的,就是要在
ASP.NET 2.0 技术中,从内部建立支持网页模板的功能,以实现网站一致性要求。
11.1 母版页概述
ASP.NET 2.0 对提供的母版页功能,为提高工作效率,降低开发和维护强度,提供了有力支持。
11.1.1 母版页基础知识 在
ASP.NET 2.0 对中,可以将 Web 应用程序中的公用元素,整合到母版页中。
可以将母版页看作是页面模板,而且是一种具有多项高级功能的页面模板。
母版页能够为
ASP.NET 应用程序创建统一的用户界面和样式,这是母版页的核心功能。
在实现网站一致性的过程中,必须包含两种文件:一种是母版页,另一种是内容页。
母版页后缀名是.master,其封装页面中的公共元素。
内容页实际是普通的.aspx 文件,它包含除母版页之外的其他非公共内容。
在运行过程中,
ASP.NET 引擎将两种页面内容合并执行,最后将结果发给客户端浏览器。
常见母版页代码结构如下所示。
lt Master LanguagequotCquot AutoEventWireupquottruequot CodeFilequotMasterPage.master.csquotInheritsquotMasterPagequot gtltDOCTYPE html PUBLIC quot-//W3C//DTD XHTML 1.0 Transitional//ENquotquothttp://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtdquotgtlthtml xmlnsquothttp://www.w3.org/1999/xhtmlquot gtlthead runatquotserverquotgt lttitlegt无标题页lt/titlegtlt/headgtltbodygt ltform idquotform1quot runatquotserverquotgt ltdivgt ltasp:contentplaceholder idquotnrquot runatquotserverquotgt lt/asp:contentplaceholdergt lt/divgt lt/formgtlt/bodygtlt/htmlgt 母版页与.aspx 文件结构之间的差异: 一是母版页的扩展名是.master,所有以 master 为后缀的文件都是母版页,这一点与普通.aspx 文件不同。
客户端浏览器可以向服务器发出请求,要求访问.aspx 文件,但是,如果请求的是母版页,则不能执行访问。
客户端可以访问内容页,通过内容页对母版页的绑定,才能够间接访问母版页。
二是普通.aspx 文件的代码头声明是<%@Pape%>,而母版页文件的代码头声明与此不同,它必须声明为<%@Master%>,即将 Page 改换为 Mater。
除此之外,母版页与普通.aspx 文件在代码结构方面基本没有差异。
三是母版页中可以包括一个 或 者 多 个 ContentPlaceHolder 控 件 , 而 在 普 通 .aspx 文 件 中 是 不 包 含 该 控 件 的 。
ContentPlaceHolder 控件起到一个占位符的作用,能够在母版页中标识出某个区域,该区域将内容页中的特定代码代替。
以上介绍了母版页与.aspx 文件结构之间的差异。
内容页与母版页关系紧密,下面简单介绍一下内容页。
内容页与普通.aspx 文件的结构区别,常见内容页的代码结构如下所示。
lt Page LanguagequotCquot MasterPageFilequot/MasterPage.masterquot AutoEventWireupquottruequotCodeFilequotCreateUserWizard.aspx.csquot InheritsquotAnonymous_CreateUserWizardquot TitlequotUntitledPagequot gtltasp:Content IDquotContent1quot ContentPlaceHolderIDquotnrquot RunatquotServerquotgt ……lt/asp:Contentgt 由以上代码可知,内容页的代码主要分为两个部分;代码头声明和 Content 控件。
内容页的代码头声明与普通.aspx 文件很相似,只是增加了属性 MasterPageFile 和 Title 设置。
属性 MasterPapeFile 用于设置该内容页所绑定的母版页的路径,属性 Title 用于设置页面 title属性值。
另外,在内容页中,还可以包括一个或者多个 Content 控件。
页面中所有非公共内容都必须包含在 Content 控作中。
每一个 Content 控件通过属性 ContentPlaceHolderID 与母版页中的 CotentPlaceHolder 控件相连接。
通过以上设置,就可以实现母版页与内容页的绑定。
ASP.NET2.0 提供的母版页功能,允许开发人员创建真正意义上的页面模板。
整个应用过程,可总结为“两个包含,一个结合”。
“两个包含’是指将页面内容分为公共部分和非公共部分,并且二者被分别包含在两个文件中。
公共部分被包含在母版页中,非公共部分被包含在内容页中。
开发人员可以根据所定义的公共内容,使用母版页来封装静态文本、HTML 元素以及
ASP.NET 服务器控件等多种 Web 元素。
需要注意的是,即使公共内容处于页面中的不同位置,仍然可以使用母版页功能将其内容整合到一个母版页文件中。
对于页面内容中的非公共部分, 只需在母版页中使用一个或者多个 ContentPlaceHolder 控件来占位即可。
ContentPlaceHolder 控件主要用于在母版页中,作为代替非公共部分的占位符号出现,而具体内容则被放置在内容页中。
内容页的创建相对简单,只需将非公共内容包含在不同的 Content 控件中即可。
“一个结合”是指通过控件应用以及属性设置等行为,将母版页和内容页有机结合。
例如 , 母 版 页 中 ContentPlaceHolder 的 ID 属 性 必 须 与 内 容 页 中 Content 控 件 的ContentPlaceHolderID 属性绑定。
11.1.2 母版页运行机制 单独的母版页是不能被用户所访问的。
没有内容页支持,母版页仅仅是一个页面模板,没有更多的实用价值。
同样道理,单独的内容页没有母版页支持,也不能够应用。
由此可见,母版页与内容页关系密切,是不可分割的两个部分。
只有同时正确创建和使用母版页以及内容页,才能发挥它们的强大功能。
首先,从代码结构方面,母版页内容以页面公共部分为主,包括代码头、ContentPlaceHolder 控件以及其他常见 Web 元素。
内容页主要包含页面非公共部分,包括两个部分:代码头和 Content 控件。
Content 控件中包含着页面非公共内容。
图 11-1 所示显示了母版页和内容页的控件对应关系。
ltasp:Content ContentPlaceHolderIDquotnrquot ltasp:contentplaceholder idquotnrquot RunatquotServerquotgt runatquotserverquotgt …… lt/asp:contentplaceholdergt lt/asp:Contentgt 图 11-1 在控件应用方面,母版页和内容页有着严格对应关系。
母版页中包含多少个ContentPlaceHolder 控件,那么内容页中也必须设置与其相同数目的 Content 控件。
图 11-1说明的是母版页和内容页之间的控件对应关系。
母版页中包含一个 ContentPlaceHolder 控件cph1。
内容页则必须对应一个 Content 控件,并且 Content 控件的属性 ContentPlaceHolderID的设置必须与 cphl 相对应。
如果将母版页的 ContentPlaceHolder 控件看作是页面中的占位符,那么占位符所对应的具体内容就包含在内容页的 Content 控件中。
二者的对应关系是通过设置 Content 控件中的 ContentPlaceHolderID 属性来完成的。
在实际应用中, 为了给整个网站创建一致的风格和样式, 一个母版页可能被多个内容页绑定。
只有正确处理母版页与内容页之间的控件对应关系,才能够准确、高效地创建 Web应用程序。
下面重点对母版页的运行过程进行说明。
当客户端浏览器向服务器发出请求,要求浏览页面时,
ASP.NET 执行引擎将执行内容页和母版页的代码,并将最终结果发送给客户端浏览器。
母版页和内容页的运行过程可以概括为以下 5 个步骤。
(1)用户通过键入内容页的 URL 来请求某页。
(2)获取内容页后,读取@Pape 指令。
如果该指令引用一个母版页,则也读取该母版页。
如果是第一次请求这两个页,则两个页都要进行编译。
(3)母版页合并到内容页的控件树中。
(4)各个 Content 控件的内容合并到母版页中相应的 ContentPlaceHolder 控件中。
(5)呈现得到结果页。
整个过程具有很强的逻辑性,并且母版页和内容页配合的非常巧妙。
从用户角度来看,合并后的母版页和内容页是一个完整的页面,并且其 URL 访问路径与内容页的路径相同。
从开发人员角度来看,控件的巧妙应用和配合,是实现的关键。
注意,在运行时,母版页成为了内容页的一部分。
实际上,母版页与用户控件的作用方式大致相同,即作为内容页的一个子级,并作为该页中的一个容器。
然而,当前母版页是所有呈现到浏览器中的服务器控件的容器。
此时,回想过去使用的#include、用户控件等实现方法,则可以更加深入理解母版页功能。
11.1.3 母版页和内容页事件顺序 通常情况下,母版页和内容页中的事件顺序对于页面开发人员并不重要。
但是,如果所创建的事件处理程序取决于某些事件的可用性, 那么了解母版页和内容页中的事件顺序很有帮助。
本节将对母版页和内容页的事件顺序进行简要说明,以便加深读者对于母版页和内容页的理解。
当访问结果页时,实际访问的是内容页和母版页。
作为有着密切关系的两个页面,二者都要执行各自的初始化和加载等事件。
具体过程如图 11-2 所示。
图 11-2 1.初始化母版页 2.初始化内容页 3.初始化 4.初始化 控件树 控件树 母版页 内容页 5.加载内容页 6.加载母版页 7.加载母版页 8.加载内容页 控件树 控件树 这 加载母版页和内容页共需要经过 8 个过程。
8 个过程显示初始化和加载母版页及内容页是一个相互交叠的过程。
基本过程是,初始化母版页和内容页控件树,然后,初始化母版页和内容页页面,接着,加载母版页和内容页,最后,加载母版页和内容页控件树。
以上 8个过程对应着 11 个具体事件。
这些事件如下所示。
1.母版页中控件 Init 事件;2.内容页中 Content 控件 Init 事件;3.母版页 Init 事件;4.内容页 Init 事件;5.内容页 Load 事件;6.母版页 Load 事件;7.内容页中 Content 控件 Load 事件;8.内容页 PreRender 事件;9.母版页 PreRender 事件;10.母版页控件 PreRender 事件;11.内容页中 Content 控件 PreRender 事件。
实际上,8 个过程或者是 11 个事件都用于说明母版页和内容页中的具体事件顺序。
内容页和母版页中会引发相同的事件。
例如,两者都引发 Init、Load 和 PreRender 事件。
引发事件的一般规律是,初始化 Init 事件从最里面的控件(母版页)向最外面的控件(Content控件及内容页)引发,所有其他事件则从最外面的控件向最里面的控件引发。
需要牢记,母版页会合并到内容页中,并被视为内容页中的一个控件,这一点十分有用。
在创建应用程序中,必须注意以上事件顺序。
例如,当在内容页中访问母版页的属性或者服务器控件时,如果按照过去的处理思路,可能会在内容页的 Page-Load 事件处理程序中加以实现。
由前文可知,在母版页 Load 事件引发之前,内容页 Load 事件已经引发,那么过去的思路显然是不正确的。
如何才能在内容页中访问母版页包含对象呢?可参考“5.5 访问母版页控件和属性”一节中介绍的实现方法。
11.4.4 母版页的优点 使用母版页功能,可以为
ASP.NET 应用程序页面创建一个通用的外观。
开发人员可以利用母版页功能创建一个单页布局,然后将其应用到多个内容页中。
总结起来,母版页具有以下 4 个优点。
1.有利于站点修改和维护,降低开发人员的工作强度 由于公共内容被集中于母版页中,因此,只要修改母版页,就可以快速完成站点修改和 维护任务,这在很大程度上提高了工作效率。
2.提供高效的内容整合能力 在母版页中,允许添加文字、控件等 Web 元素,同时,也可以为这些 Web 元素添加相 应事件处理程序等。
例如,只需要在母版页中添加一个服务器控件及其事件处理程序, 那么站点内所有引用该母版页的网页,都将获得同样的应用效果。
3.有利于实现页面布局 母版页中的 ContentPlaceHolder 控作起到了占位的作用,这在很大程度上,有利于进行 页面布局等工作。
4.提供一种便于利用的对象模型 由内容页和母版页组成的对象模型,能够为应用程序提供一种高效、易用的实现方式, 并且这种对象模型的执行效率较以前的处理方式有了很大提高。
11.2 创建母版页 母版页中包含的是页面公共部分,即网页模板。
使用 Visual Studio 2005 创建一个普通Web 站点,然后,在站点根目录下创建一个名为 MasterPage.master 的母版页。
由于这是一 .个添加新文件的过程,因此,单击“网站”命令菜单中的“添加新项.”选项,可以打开如图 11-3 所示的窗口。
图 11-3 由于创建的是母版页,因此,需要选择母版页图标,并且设置文件名为MasterPage.master。
需要注意的是,该窗口中还有一个复选框项“将代码放在单独的文件中” 。
默认情况下,该复选框处于选中状态。
表示 Visual Studio 2005 将会为 MasterPage.master 文件应用代码隐藏模型,即在创建 MasterPage.master 文件的基础上,自动创建一个与该文件相关的 MasterPape.masteres.cs 文件。
如果不选中该项,那么只会创建一个 Mastermsge.master文件而已。
建议读者选取该项。
在创建 MasterPnge.master 文件之后,接着就可以开始编辑该文件了。
使用 Visual Studo 2005 可以对母版页进行编辑,并且它完全支持“所见即所得”功能。
无论是在代码模式下,还是设计模式下,使用 Visual Studo 2005 编辑母版页的方法,与编辑普通.aspx 文件是相同的。
图中两个矩形框表示 ContentPlaceHolder 控件。
开发人员可以直接在矩形框中添加内容,所设置内容的代码将包含在 ConentPlaceHolder 控件声明代码中。
需要注意的是,这种方法是不规范的,因此,不推荐使用这种做法。
11.3 创建内容页 在创建一个完整的母版页之后,接下来必然要创建内容页。
从用户访问的角度来讲,内容页与最终结果页的访问路径相同,这好像表明二者是同一文件,实际不然。
结果页是一个虚拟的页面,没有实际代码,其代码内容是在运行时状态下母版页和内容页合并的结果。
在开始介绍内容页之前,还有两个概念需要强调:一是内容页中所有内容必须包含在 Content控件中;二是内容页必须绑定母版页。
虽然内容页的扩展名与普通 ASPNET 页面相同,但是,其代码结构有着很大差别。
在创建内容页的过程中,必须时刻牢记以上两个重要概念。
与创建母版页差不多,创建内容页的过程比较简单。
单击“网站”命令菜单中的“添加 ,或者在解决方案管理器中右键单击项目,在下拉菜单中选择“添加新项…”新项…” ,就可以打开如图 11-3 所示的窗口。
如图 11-3 所示,要求选择新建文件类型。
由于内容页与普通.aspx 页面的扩展名相同,因此,选择的是 Web 窗体图标。
接着,还需要设置文件名 Index..aspx。
设置完成之后,不可直接单击“添加”按钮。
因为,内容页必须绑定母版页,所以还需要对复选框“将代码放 “选在单独的文件中”和“选择母版页”进行设置。
前者在前文中已经说明,重点说明后者。
择母版页”复选框用于设置所创建 Web 窗体是否绑定母版页。
如果创建的是内容页,那么必须选中该选项。
结束以上操作之后,可以单击“确定”按钮,从而弹出如图 11-4 所示的窗口。
图 11-4 窗口左侧是项目文件夹,右侧是文件夹中的母版页列表。
图 11-4 所示窗口中已经列举了刚刚创建的母版页 MasterPape.master,选中该文件,单击“确定”按钮即可。
经过以上步骤,就顺利创建了一个绑定母版页 MasterPape.master 的内容页 Index.aspx 了。
同母版页一样,Visual Studo 2005 支持对于内容页的可视化编辑,并且这种支持是建立在只读显示母版页内容基础上的。
在编辑状态下,可以查看母版页和内容页组合后的页面外观,但是,母版页内容是只读的(呈现灰色部分) ,不可被编辑,而内容页则可以进行编辑。
如果需要修改母版页内容,则必须打开母版页。
11.4 嵌套母版页 实现新特性,为开发人员提供便利,都是通过技术改进来实现的。
深人思考,将能体会到在技术改进过程中,始终融会着一个高层设计思想,即“模块化设计,模块化应用”的原则。
这种原则可以说是无处不在。
例如,应用程序中的服务器控件、分层、用户控件,甚至是本章所讨论的母版页和内容页问题,都体现着这样的原则。
母版页和内容页包含着不同类型的内容,实现着不同的功能,开发人员可以将母版页和内容页这样的“积木块”拼成结果页。
应用程序中的任何页面,只要功能需要,完全可以使用“拼积木”的思想,将相关母版页和内容页等模块拼接在一起。
如果理解了这种思想,那么掌握本节介绍的嵌套母版页将会非常容易。
本节以上文所述思想为依据,通过示例说明了嵌套母版页的实现方法。
首先,说明嵌套母版页的概念。
所谓“嵌套”,就是一个套一个,大的物件套装小的物件。
嵌套母版页是指在大的母版页中包含一个小的母版页,以此完成页面构建工作。
无论母版页如何嵌套构建页面,必须包含一个内容页。
原因是不允许客户端浏览器访问扩展名为.master的母版页。
主母版页 子母版页 内容页 图 11-5 图 11-5 所示显示的是嵌套母版页示意图。
图中包括主母版页、子母版页和内容页。
显然,主母版页嵌套子母版页,内容页绑定子母版页,三者之间保持着紧密的嵌套关系。
从页面内容和结构角度来讲,Web 页面最为公共的部分基本都包含在主母版页中,而其他部分则包括在子母版页中。
子母版页与主母版页相同,都是扩展名为.master 的文件。
通 常 情 况 下 , 子 母 版 页 中 包 含 一 些 Content 控 件 , 这 些 控 件 将 映 射 到 主 母 版 页 的ContentPlaceHolder 控件,因此,子母版页具有一定占位功能。
就这方面而言,子母版页的布局方式与所有内容页类似。
然而,子母版页还有自己的 ContentPlaceHolder 控件(包含在 ,用于显示它所绑定的内容页提供的内容。
Content 控件中) 从模块化的角度来讲,在构建 Web 页面过程中,主母版页起到了类似页面框架的功能。
通过采用占位方式,子母版页和内容页将页面分割为不同的模块,为开发和应用提供了便利。
这是一种非常重要的思想。
秉承这种思想,可以首先将页面分成不同的模块,然后利用主母版页、子母版页和内容页来实现页面模块。
例如,大型同站可能包含一个用于定义站点内容的主母版页。
不同的网站内容合作伙伴又可以定义各自的子母版页,这些子母版页嵌套在主母版页中,并通过自身及绑定内容页来定义合作伙伴的内容。
上面所示的是内容页的源代码, 构建方法与普通内容页的一致。
内容页的代码结构仍然包含代码头声明和 Content 控件(如粗体所示)。
在实现过程中需要注意的是,由于内容页绑定子母版页,因此,代码头声明中,属性 MasterPageFile 必须设置为子母版页的路径。
由以上 3 个文件源代码可知,正确创建 3 种文件有两个关键点:一是声明代码头,二是ContentPlaceHolder、Content 控件的属性设置。
代码头声明的方法,在上文己经介绍过了。
下面重点说明页面中 Content 和 ContentPlaceHolder 控件的属性设置。
如图 5-14 所示,主母版页、子母版页和内容页中的 ContentPlaceHolder、Content 控件属性设置有着严格的对应关系。
从左至右,主母版页中的控件 ContentPlaceHolder1 起着“占位”作用,具体内容位于子母版页 Content1 控件中。
Content1 控件中除包含部分普通 Web元素之外,还包含一个 ContentPlaceHolder2 控件。
该控件同样起着“占位”作用,具体内容位于内容页的 Content2 控件中。
通过以上分析,可以发现,只有在创建过程中,建立严格的对应关系,才能够正确创建嵌套母版页及其相关文件。
和创建普通母版页、内容页相同,创建嵌套母版页同样需要使用 Visual Studio 2005。
不同之处在于,创建嵌套母版页过程中,Visual Studio 2005 只支持对于主母版页的可视化编辑,而不支持子母版页和内容页。
也就是说必须在代码模式下,创建子母版页和内容页。
对于部分开发人员来讲,这是一个不小的挑战。
开发人员必须胸有成竹才能快速、正确地完成页面创建工作。
创建嵌套母版页的基本代码如下:lt Master LanguagequotCquot AutoEventWireupquottruequot CodeFilequotSubMasterPage2.master.csquotInheritsquotS.
上一篇:
本科教材
下一篇:
汝康皮肤护理液医治烧伤的可行性和效果分析