尊重作者,请保留 www.it55.com 链接字样。
过完五一了,一身的臭汗,想洗个澡先。但最后还是决定先把今天的课程写了再作其他事情。
我们做网站的时候经常会出现这种情况:每个页面都要有头部和尾部,而这些头部或尾部大多数时间都是一模一样的,重复性的劳动让我们显得很无奈。asp程序员通过include来解决这个问题,asp.net 1.X程序员通过自定义控件来实现公共部分的重用。但这些方法都有无法回避的弊端,asp.net提供给我们了另一种新的解决方案,那就是母版技术。
1、简单母版应用
在当前项目上右键单击>>>添加新项
在弹出的“添加新项”对话框的模板选项中,选择母版页,点击“添加”
vs已经将一个简单的母版页添加到当前项目中。
对母版页面进行简单修改,最终代码如下:
<%@ Master Language="C#" AutoEventWireup="true" CodeFile="MasterPage.master.cs" Inherits="MasterPage" %>
<!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">
<p>我是母版页内容</p>
<div>
<asp:contentplaceholder id="ContentPlaceHolder1" runat="server">
</asp:contentplaceholder>
</div>
</form>
</body>
</html>
大家注意看代码的蓝色部分。
接下来我们向当前项目中添加web窗体文件:
在当前项目上右键单击>>>添加新项。
在弹出的“添加新项”对话框的模板选项中,选择web窗体,并同时选中“选择母版页”,点击“添加”:
系统接着会弹出“选择母版页”配置框,选择对应项目下的对应母版,单击“确定”:
系统便自动生成内容页,代码经简单修改,代码如下:
<%@ Page Language="C#" MasterPageFile="~/MasterPage.master" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" Title="Untitled Page" %>
<asp:Content ID="Content1" ContentPlaceHolderID="ContentPlaceHolder1" Runat="Server">
我是内容页部分。
</asp:Content>
大家注意看代码的蓝色部分。
运行之后,大家会看到:
当我们请求内容页Default.aspx时,系统自动将母版文件内容应用至内容页中,并把最终处理结果展示给我们。asp.net 2.0究竟是怎么实现母版页和内容页之间的整合的呢?下面是一个简单的过程描述:
用户通过内容页的URl请求这个内容页面 >>> 系统获取该内容页后,通过读取@page指令中的MasterPageFile属性获取对应的母版页 >>> 系统将母版页合并到内容页的控件树中。 >>> 系统根据母版页中的"contentplaceholder"控件的ID和内容页Content控件的"ContentPlaceHolderID"属性值,将各个Content控件的内容合并到母版页中相应的ContentPlaceHolder控件中 >>> 系统将合并之后的结果页面发送给客户端。
2、嵌套母版应用
嵌套母版页其实是母版页功能的高级应用,就是在大的母版页中包含一个小的母版页。这里需要注意的是,不管母版页有无嵌套、或者有几个嵌套,整个页面构架中必须至少包含一个内容页,因为母版页本身是不能被用户访问到的。
以下是嵌套母版页应用的简略代码:
大母版页BigMasterPage.master:
<%@ Master Language="C#" AutoEventWireup="true" CodeFile="MainMasterPage.master.cs" Inherits="MainMasterPage" %>
<!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>大母版页内容</div>
<div>
<asp:contentplaceholder id="ContentPlaceHolder1" runat="server">
</asp:contentplaceholder>
</div>#p#分页标题#e#
</form>
</body>
</html>
大母版和简单应用时的一样,没有什么变动.
小母版页SmallMasterPage.master:
<%@ Master Language="C#" AutoEventWireup="true" CodeFile="SmallMasterPage.master.cs" Inherits="SmallMasterPage" MasterPageFile="~/MainMasterPage.master"%>
<asp:Content ID="SubContent" ContentPlaceHolderID="ContentPlaceHolder1" runat="server">
<div>小母版内容</div>
<div>
<asp:contentplaceholder id="ContentPlaceHolder2" runat="server">
</asp:contentplaceholder>
</div>
</asp:Content>
这里看来小母版其实是一个带有母版标记的特殊内容页而已,Content控件之外只允许存在文件头,和部分程序,拒绝存在html代码等.
内容页:Content.aspx:
<%@ Page Language="C#" MasterPageFile="~/SmallMasterPage.master" AutoEventWireup="true" CodeFile="Content.aspx.cs" Inherits="Content" Title="Untitled Page" %>
<asp:Content ID="Content1" ContentPlaceHolderID="ContentPlaceHolder2" Runat="Server">
内容页内容
</asp:Content>
和简单应用时也一样,不过这里选用的母版是SmallMasterPage.master.
大家着重看蓝色部分哦.运行结果:
3、访问母版页控件及属性
在进行程序设计的时候,我们可能需要在内容页中对母版页进行操控.要访问母版页的的控件或属性有以下几种方法:
一、使用FindControl方法获取母版页控件的引用
利用内容页page对象的Master公共属性,我们可以实现对关联母版页的引用。进而使用母版页的FindControl方法来实现对母版页控件的访问。
母版页MasterPage.master:
<%@ Master Language="C#" AutoEventWireup="true" CodeFile="MasterPage1.master.cs" Inherits="MasterPage1" %>
<!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">
<asp:Label runat="server" ID="masterlabel">母版页的内容</asp:Label>
<div>
<asp:contentplaceholder id="ContentPlaceHolder1" runat="server">
</asp:contentplaceholder>
</div>
</form>
</body>
</html>
内容页Content1.aspx:
<%@ Page Language="C#" MasterPageFile="~/MasterPage1.master" AutoEventWireup="true" CodeFile="content1.aspx.cs" Inherits="content1" Title="Untitled Page" %>
<script runat="server">
void Page_LoadComplete(Object sender, EventArgs e)
{
contentlabel.Text = (Master.FindControl("masterlabel") as Label).Text;
}
</script>
<asp:Content ID="Content1" ContentPlaceHolderID="ContentPlaceHolder1" Runat="Server">
<asp:Label ID="contentlabel" runat="server">这里将显示母版页masterlabel控件的内容。</asp:Label>
</asp:Content>
其中,“Page_LoadComplete”是内容页面加载完成时触发的一个事件。
运行结果:
二、使用MasterType指令获取母版页控件的引用
相对于上面的FindControl方法而言,MasterType显得很直接。通过使用MasterType,可以创建与母版页的强类型引用。
将FindControl方法例子中的MasterPage.master更改如下:
<%@ Master Language="C#" AutoEventWireup="true" CodeFile="MasterPage1.master.cs" Inherits="MasterPage1" %>
<script runat="server">
public Label MasterPageLabel//注意:将母版页label控件强类型化,方便内容页访问。对母版页属性的访问也使用该方法。
{
get#p#分页标题#e#
{
return masterlabel;
}
set
{
masterlabel = value;
}
}
</script>
<!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">
<asp:Label runat="server" ID="masterlabel">母版页的内容</asp:Label>
<div>
<asp:contentplaceholder id="ContentPlaceHolder1" runat="server">
</asp:contentplaceholder>
</div>
</form>
</body>
</html>
将FindControl方法例子中的Content1.aspx更改如下:
<%@ Page Language="C#" MasterPageFile="~/MasterPage1.master" AutoEventWireup="true" CodeFile="content1.aspx.cs" Inherits="content1" Title="Untitled Page" %>
<%@ MasterType VirtualPath="~/MasterPage1.master" %>
<script runat="server">
new void Page_Load(Object sender, EventArgs e)
{
contentlabel.Text = Master.MasterPageLabel.Text;
}
</script>
<asp:Content ID="Content1" ContentPlaceHolderID="ContentPlaceHolder1" Runat="Server">
<asp:Label ID="contentlabel" runat="server">这里将显示母版页masterlabel控件的内容。</asp:Label>
</asp:Content>
4、母版页应用范围配置
以上实例都是页面级母版页应用,只要在对应内容页页面头部声明或设置即可。
如果是程序级母版页应用,应在Web.config中作以下设置:
<configuration>
<system.web>
<pages MasterPageFile="~/MasterPage.master" />
</system.web>
</configuration>
屏蔽某个文件夹使用该母版方案,可以通过在该文件夹下放置不同的web.config文件来实现。
屏蔽某个文件使用该母版方案,可以通过设置.aspx页面头部来实现:
<%@ Page Language="C#" MasterPageFile="~/OtherMasterPage.master" %>
如果不想使用母版,可以把MasterPageFile属性值留空即可。
下节内容:asp.net 2.0新特性:主题和皮肤