书签 分享 收藏 举报 版权申诉 / 17

类型第七章使用母版页设计网站.docx

  • 文档编号:7581939
  • 上传时间:2023-01-25
  • 格式:DOCX
  • 页数:17
  • 大小:445.63KB

800px">

contentplaceholderid="ContentPlaceHolder1"runat="server">

contentplaceholder>

Copyright(C)金石科技2009-2012,AllRightsReserved

京ICP证666666号

代码分析:

示例7-1中的代码定义了标准标题、菜单和脚标在页面整个结构中的位置,还使用ContentPlaceHolder服务器控件定义了页面内容在母版页中的位置。

ContentPlaceHolder派生自Control,它并不添加自己的属性、方法或事件。

其唯一作用是标记页面内容在母版页模板中的位置。

这里的母版页只有一个ContentPlaceHolder控件,但如果页面的内容应该位于不同的区域(例如左列和右列),就可以添加多个ContentPlaceHolder控件。

添加多个ContentPlaceHolder控件时,需要确保每个控件都有唯一的ID。

提示:

在母版页中定义的图像或其他资源的路径与使用母版页显示的实际页面相关,该路径与母版页本身的位置没有关系。

例如,如果一个页面位于网站的根目录下,且存在一个Images子文件夹,则使用Images/ImageName.gif定义母版页中的图像就是正确的,因为Images子文件夹位于该页面的下一级。

对于不位于网站根目录的页面,该路径不起作用,最终会导致图像在浏览器中由于找不到源文件而不显示。

应该把母版页的路径定义为当前网站根目录中的图像、样式表、JavaScript文件等。

示例7-1中的母版页包含一个img标记,其src属性以/WebBook开头,所以图像路径从网站的根目录开始定义。

这类路径可以处理嵌套在任一级的页面。

对于ASP.NET服务器控件,如Image控件,可使用~字符表示图像路径从网站的根目录开始:

Imageid="imgHeader"runat="Server"

ImageUrl="~/第七章/Images/validate.gif"/>

母版页可以有相关的代码文件,以使HTML代码和编程代码清晰地分隔开来,就像ASP.NETWeb窗体和用户控件那样。

示例7-1中的母版页示例与一个C#类WebsiteMasterPage关联起来,该类位于WebsiteMasterPage.master.cs文件中。

标准事件处理程序,如Page_Load、Page_PreRender等都可以包含进来,以便在运行期间动态修改母版页的内容。

7.1.2创建内容页面

前面介绍了母版页的一些基础知识,现在该讨论ASP.NET页面如何使用母版页了。

引用母版页的页面称为内容页面。

内容页面与一般的ASP.NET页面在几个方面有所区别。

第一,一般的ASP.NET页面表示一个完整的页面,包括HTML、body和form标记,而内容页面不包含这些标记,因为它们一般是在母版页中定义的(内容页面可能有form标记,也可能没有)。

第二,内容页面必须包含一个Content服务器控件,而一般的ASP.NET页面不包含这个控件。

最后,一般的ASP.NET页面不使用母版页,而内容页面依赖母版页控制页面的整体结构和布局。

尽管这两种页面有许多不同之处,但它们都使用.aspx文件扩展名。

要在内容页面中引用母版页,可以使用Page指令的MasterPageFile属性。

MasterPageFile属性中定义的路径应以Web应用程序的根目录开始,这样,如果页面移动到网站文件夹结构的另一级上,它仍包含指向母版页的正确路径。

~字符可以用于确保路径从网站的根目录开始。

<%@PageLanguage="C#"MasterPageFile="MasterDemo.master"AutoEventWireup="true"CodeFile="ContentPageDemo.aspx.cs"Inherits="第七章_ContentPageDemo"Title="UntitledPage"%>

除了引用母版页的文件位置之外,内容页面还需要包含一个Content服务器控件,它包含页面的实际内容。

Content控件继承自Control类,并添加了ContentPlaceHolderID属性。

ContentPlaceHolderID用于标识母版页上的ContentPlaceHolder控件,在该控件上将放置页面的内容。

一个简单的内容页面如示例7-2所示,该内容页面使用了MasterPageFile属性和Content服务器控件:

练习7-2使用MasterPageFile属性和Content服务器控件的简单的内容页面

<%@PageLanguage="C#"MasterPageFile="MasterDemo.master"AutoEventWireup="true"CodeFile="ContentPageDemo.aspx.cs"Inherits="第七章_ContentPageDemo"%>

ContentID="Content1"ContentPlaceHolderID="ContentPlaceHolder1"Runat="Server">

Content>

注意,内容页面不包含任何HTML或body标记,因为这些标记都是在母版页文件WebsiteMasterPage.master中定义的。

在这个例子中,form标记也在母版页中定义。

页面的内容放在Content服务器控件中,该控件的ContentPlaceHolderID值对应于母版页中的ContentPlaceHolderID值。

如果Content控件的ContentPlaceHolderID值不匹配母版页中的ContentPlaceHolder控件的ID值,就会产生一个错误,因为ASP.NET运行库不知道应把页面的内容放在母版页的控件集合的什么地方。

内容页面的所有内容都必须放在一个或多个Content服务器控件中,所以一般看不到Title标记,也没有要放在该标记中的head标记。

Page指令包含一个Title属性,它可以用于设置内容页面的标题,否则内容页面会使用母生版页的标题作为自己的标题。

标题也可以通过编程方式进行修改,如下一节所述。

<%@PageLanguage="C#"MasterPageFile="MasterPage.master"Title="内容页面示例"%>

图7-1显示了在VisualStudio.NET2005中,内容页面在设计期间的情形。

注意,内容页面自动与母版页合并在一起,提供了整个页面在设计期间的视图。

内容页面显示在图形中间的白色区域,可以在设计视图中直接编辑。

母版页是灰色的,不能编辑。

图7-1母版的设计视图

当然可以手动创建内容页面,但VisualStudio.NET还能更方便地创建它们,具体方法是:

在网站上添加一个新项,选择选择母版页复选框。

图7-2显示了用VisualStudio.NET2005创建内容页面的第一步。

添加了新项后,就可以选择要引用的母版页。

这个例程会自动创建一个内容页面,其中包含MasterPageFile属性和一个或几个Content服务器控件(取决于ContentPlaceHolder控件在母版页中定义的个数)。

图7-2建立内容页面

右击解决方案资源管理器中需要的母版页,从菜单中选择添加内容页,也可以创建内容页面。

内容页面放在母版页所在的位置上,其名称是Default.aspx,除非已存在该名称的文件。

7.2编程修改母版页

创建母版页和内容页面是很简单的,但创建动态网站还可以利用许多其他技术。

母版页可以在内容页面中使用ASP.NET2.0版本提供的Page类的一个属性Master来编程处理。

Master属性可以编程访问由内容页面引用的母版页,完成修改标题,添加其他元数据属性,添加样式表引用,以及修改控件集合等操作。

7.2.1修改母版页的标题部分

根据母版页建立相应的内容页时,内容页会自动产生一个缺省标题:

UntitledPage的默认,如果要固定此页面的标题则直接修改内容页面的title属性即可,当用户需要继承母版页的标题做为内容页标题时,则删除内容页的标题后,页面所呈现出来的标题就是母版页的标题。

如果要修改母版页的标题部分,可以调用内容页面中的Master.Page.Header属性。

访问标题时,可以修改标题,甚至添加新的元数据内容,如下所示:

//ContentPage

protectedvoidPage_Load(objectsender,EventArgse){

HtmlHeadhead=this.Master.Page.Header;

head.Title="内容页面示例";

HtmlMetameta=newHtmlMeta();

meta.Name="Keywords";

meta.Content="母版页s,ASP.NET";

head.Controls.Add(meta);

}

上面的代码访问内容页面的Master属性,用它获得Header属性。

接着修改标题,在标题的Controls集合中添加一个新的HtmlMeta控件,该控件指定与内容页面相关联的关键字。

在母版页中定义的head标记必须添加了runat="server"属性,这样Header属性才能返回一个HtmlHead对象实例:

母版页Demo

如果head标记没有runat="server"属性,代码就会返回一个错误,因为HtmlHead对象是空的。

7.2.2查找母版页中的控件

在内容页中,Page对象具有一个公共属性Master,该属性能够实现对相关母版页基类MasterPage的引用。

母版页中的MasterPage相当于普通ASP.NET页面中的Page对象,因此,可以使用Masterpage对象实现对母版页中各个子对象的访问,但由于母版页中的控件是受保护的,不能直接访问,那么就必须使用MasterPage对象的FindControl方法实现。

练习:

访问母版页上的控件

练习内容:

下面的练习示例主要通过使用FindControl方法,获取母版页中用于显示系统时间的Label控件。

练习步骤:

1、在例7-1生成的母页MasterDemo.master基础上,加入下Lable控件lblDate,用于显示当前的日期

2、在MasterDemo.master母版页的Page_Load事件中,使母版页的Label控件显示当前系统日期的代码如下。

protectedvoidPage_Load(objectsender,EventArgse)

{

this.labMaster.Text="今天是"+DateTime.Today.Year+"年"+DateTime.Today.Month+"月"+DateTime.Today.Day+"日";

}

3、在前面建立的内容中页面ContentDemo.aspx中加入一个Lable控件,命名为lblContentDate,将它来获取母版页中的Lable控件中的日期,在此页面的Page_LoadComplete事件中,写入如下代码。

protectedvoidPage_LoadComplete(objectsender,EventArgse)

{

LabellblMaster=(Label)this.Master.FindControl("lblDate");

lblContentDate.Text=lblMaster.Text;

}

代码分析:

由于在母版页的Page_Load事件引发之前,内容页Page_Load事件已经引发,所以,因此本练习中使用ASP.NET2.0新增的Page_LoadComplete事件,利用FindControl()方法来获取母版页的控件,其中Page_LoadComplete事件是在网页加载结束时触发。

当然还可以在Label控件的PreRender事件中完成此功能

7.2.3定义母版页的属性

FindControl()方法是有效的,但需要转换类型,因为它返回Control类型的对象。

虽然进行转换的系统开销非常小,但还有一种更容易的方法来访问母版页中的lblDate。

该方法不使用FindControl(),而是在母版页中定义一个公共属性,直接把lblDate返回为Label类型:

publicLabelLbLDate

{

get

{

returnthis.lblDate;

}

}

}

这里的LbLDate属性只是定义了一个get块,返回对母版页中LbLDate面板控件的直接引用。

但是,访问该属性也需要进行类型转换。

调用内容页面中的Master.PnlLogin会失败,因为LbLDate不是MasterPage对象的一个有效属性,其中MasterPage对象是调用Master属性返回的。

要获得LbLDate属性,必须把MasterPage对象转换为相应的特定母版页类型,如下所示:

LabellblMaster=((第七章_MasterDemo)this.Master).LbLDate;

这比使用FindControl()更简洁、更高效,因为不必迭代访问母版页的Controls集合来定位lblDate,但仍需要进行类型转换。

这里还假定母版页总是第七章_MasterDemo类型,根据站点的动态性质,母版页可能是第七章_MasterDemo类型,也可能不是。

7.2.4使用MasterType指令

为了调用母版页的LbLDate属性,且不进行任何类型转换,需要利用内容页面中的MasterType指令。

MasterType指令位于内容页面的开头,提供了对母版页的强类型化访问,便于调用定制属性或方法。

它允许使用VirtualPath属性指定母版页的虚拟路径,或使用TypeName属性指定母版页类的名称。

注意,可以使用VirtualPath或TypeName,但不能同时使用它们。

如果使用了TypeName,母版页类就必须在一个已链接的程序集上是可用的,例如App_Code文件夹中的代码创建的程序集。

使用MasterType指令和VirtualPath属性的示例如下:

<%@MasterTypeVirtualPath="MasterDemo.master"%>

从使用MasterType指令的内容页面上调用Master属性时,会自动访问相应的母版页类型及其所有关联的属性和方法。

现在,就可以直接访问母版页中定义的LbLDate属性了,不需要任何类型转换:

protectedvoidPage_LoadComplete(objectsender,EventArgse)

{

//直接访问Master属性返回强类型对象,再通过此对象返回LbLDate属性

LabellblMaster=this.Master.LbLDate;

lblContentDate.Text=lblMaster.Text;

}

提示:

使用MasterType指令可以提供最佳性能,因为不必使用FindControl()迭代母版页的Controls集合,来获得lblDate,不需要对定义LbLDate属性的相应母版页类型进行转换,编写的代码量最少,错误也比较少且效率较高。

7.3嵌套母版页

许多公司都有多个发布到网站上的部门。

每个部门常常自由创建自己的布局和内容,终端用户会在部门之间导航。

使公司的网站有统一的结构和布局是一个困难的任务,幸好,利用嵌套母版页的功能,可以解决这一难题。

7.3.1创建嵌套的母版页

上面的母版页,定义了标准的公司标题、脚标,每个部门站点都必须使用它。

每个部门站点还可以创建自己的母版页,表示其业务站点上Web页面的布局。

然后,把这个部门的母版页嵌套在标准的网站母版页中。

这么做对终端用户有好处,因为无论他们访问哪个部门站点,总是会看到标准的标题、脚标和菜单,还给部门站点的发布者提供了一些权限,因为他们可以创建自己的嵌套母版页。

每个部门都可以利用标准的公司母版页创建本部门专用的母版页。

尽管部门母版页有其独特的方面,但它需要引用标准的公司母版页。

为此,可以使用Master指令的MasterPageFile属性。

示例7-4是人力资源部门母版页的一个例子。

示例7-4部门母版页

<%@MasterMasterPageFile="MasterDemo.master"Language="C#"AutoEventWireup="true"CodeFile="HrMasterPage.master.cs"Inherits="第七章_HrMasterPage"%>

ContentID="content1"ContentPlaceHolderID="cphMain"runat="server">

DOCTYPEhtmlPUBLIC"-//W3C//DTDXHTML1.0Transitional//EN""http:

//www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

bold;font-size:

large;color:

red;">人力资源部门的母版页

contentplaceholderid="cphHR"runat="server">

contentplaceholder>

Content>

仔细查看人力资源部门部门母版页,注意它引用了公司的标准网站母版页,其名称是MasterDemo.master。

部门母版页还定义了一个Content服务器控件,该控件引用了在标准母版页(本例是cphMain)中定义的ContentPlaceHolderID。

Content控件必须添加,因为这个母版页嵌套在标准的公司

配套讲稿:

如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。

特殊限制:

部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。

关 键  词:
第七章 使用母版页设计网站 第七 使用 母版 设计 网站
提示  冰豆网所有资源均是用户自行上传分享,仅供网友学习交流,未经上传用户书面授权,请勿作他用。
关于本文
本文标题:第七章使用母版页设计网站.docx
链接地址:https://www.bdocx.com/doc/7581939.html
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2008-2022 冰点文档网站版权所有

经营许可证编号:鄂ICP备2022015515号-1

收起
展开