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

上传人:b****6 文档编号:7581939 上传时间:2023-01-25 格式:DOCX 页数:17 大小:445.63KB
下载 相关 举报
第七章使用母版页设计网站.docx_第1页
第1页 / 共17页
第七章使用母版页设计网站.docx_第2页
第2页 / 共17页
第七章使用母版页设计网站.docx_第3页
第3页 / 共17页
第七章使用母版页设计网站.docx_第4页
第4页 / 共17页
第七章使用母版页设计网站.docx_第5页
第5页 / 共17页
点击查看更多>>
下载资源
资源描述

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

《第七章使用母版页设计网站.docx》由会员分享,可在线阅读,更多相关《第七章使用母版页设计网站.docx(17页珍藏版)》请在冰豆网上搜索。

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

第七章使用母版页设计网站

第七章使用母版页设计网站

自引入Internet以来,使网站有统一的外观和操作方式是开发人员一直试图解决的一个问题。

大多数网站都有标题、脚标和菜单结构,但它们对放置其中的各个项目的处理方式不同。

多年来,产生了几个不同的技术来解决这个问题,例如服务器端的include文件、层叠样式表(CSS)、定制模板文件、XML和XSLT,以及最近的ASP.NET用户控件等。

这些技术都有其优缺点,但没有一种技术提供了使网站保持一致的解决方案。

在ASP.NET1.1中,用户控件(和CSS)提供了使网站布局保持一致的最佳方案,因为它们是面向对象的,可以定义一个或多个页面上的通用标题、脚标和菜单。

但是,大多数开发人员都要在每个页面上使用Reference指令以及相关的TagPrefix和TagName属性,来引用用户控件,导致代码的重复。

为了解决这些重复代码的问题,一些开发人员尝试把用户控件嵌入其他用户控件中。

这个方式的确有效,但在加载或回送操作中需要编程访问控件时,嵌套的对象模型很难使用。

ASP.NET2.0可以为网站提供统一的布局和结构。

该方式不是采用嵌套的用户控件、定制类和模板,而是使用ASP.NET2.0的母版页(母版页)定义网站的整体布局,且所花的时间和精力非常少。

它们可以在一个地方定义,在整个网站上共享,且不需要把标题、脚标和菜单用户控件硬编码到每个页面上。

本章将介绍母版页,描述可以在ASP.NET2.0网站上使用的各种技巧。

前两节概述母版页的创建和使用,其后的章节深入探讨母版页的用法。

7.1母版页基础

母版页提供了一种简单而高效的模板框架,它允许在一个模板文件中定义网站的公共组件,例如菜单、标题和脚标。

这将快速而轻松地修改网站的整体外观、操作方式和布局,因为对母版页模板的修改会自动应用于整个网站。

许多网站都只需要一个母版页,但也可以根据需要创建多个母版页——一个用于主页、一个用于子页面。

母版页也可以根据用户的配置或其他条件动态加载。

因此很容易提供页面的可打印版本,而无需修改页面的内容。

所有的母版页都有.master扩展名,它映射到处理程序System.Web.HttpForbiddenHandler上。

这个映射在Web服务器的默认web.config文件中定义,可以防止母版页直接在浏览器中打开,就好像带.ascx和.config扩展名的文件不能用浏览器查看一样。

试图在浏览器中查看扩展名为.master的文件,会导致一个“这类页面不能打开”错误。

母版页依赖.NETFramework中的已有类来执行其逻辑。

它们直接派生自UserControl类:

publicclassMasterPage:

System.Web.UI.UserControl

派生自UserControl的结果是,母版页有一组标准的属性,例如Page、Session、Request和Response,它们可以以编程方式访问。

母版页不能直接在InternetInformationServices(IIS)应用程序(如用户控件)之间共享,否则会生成一个错误。

本章的后面将学习解决这个问题的一种方式,让母版页可以在服务器的多个IIS应用程序之间共享。

7.1.1创建母版页

在VisualStudio.NET2005中,使用“添加新项”菜单就可以创建母版页,也可以在自己喜欢的文本编辑器中手动创建母版页。

简单的母版页(MasterDemo.master)如示例7-1(MasterDem.master)所示。

例7-1简单的母版页

<%@MasterLanguage="C#"AutoEventWireup="true"CodeFile="MasterDemo.master.cs"Inherits="第七章_MasterDemo"%>

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

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

//www.w3.org/1999/xhtml">

母版页示例

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控件必须添加,因为这个母版页嵌套在标准的公司

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 总结汇报 > 实习总结

copyright@ 2008-2022 冰豆网网站版权所有

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