嵌套母版页

写在前面的话:

对于一个项目来说,我们可能会用到许多的母版页+内容页的组合.那么当我们使用到多个母版页时,我们可能会遇到这样的问题.在不同的母版页内加载相同的js和css内容.

如果一个js或css文件在项目中的位置发生了变化,我们就要修改多个母版页的js和css的link.

对此,我们或许可以使用嵌套母版页的形式,来使我们尽量只改变一处的link,就可以使所有页面的js或css得到更新.

下面,我们举例说明.

例子介绍:

在例子中,我们有以下内容:

1.一个main.master页,在这个页面中,有一个ID为btn_main的Button和一个div

2.一个sub1.master页,在这个页面中,有一个ID为btn_sub1的Button和一个div

3.一个WebForm1.aspx内容页,有一个ID为btn_page的Button和一个div

4.一个1.js文件,js文件中有一个myAlert()的函数

5.一个1.css文件,css文件中有.myBack样式

文档结构如下:

image

例子展示内容:

1.通过main.master如何引用公共的js和css文件

2.通过WebForm1.aspx页,如何访问main.master的button、访问sub1.master的button

例子:

main.master的代码:

<%@ Master Language="C#" AutoEventWireup="true" CodeBehind="Main.master.cs" Inherits="WebMasterTest.masterpages.Main" %>

<!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>
    <link href="../css/1.css" rel="stylesheet" type="text/css" />
    <script src="<%= Request.ApplicationPath%>/scripts/1.js" type="text/javascript"></script>
    <asp:ContentPlaceHolder ID="head" runat="server">
    </asp:ContentPlaceHolder>
</head>
<body>
    <form id="form1" runat="server">
    <div>
        <asp:Button ID="btn_main" runat="server" Text="我是主母版页上的按钮" OnClientClick="myAlert('我是主母版页上的按钮');" />
        <div class='myBack'>主模板页</div>
        <asp:ContentPlaceHolder ID="ContentPlaceHolder1" runat="server">
       
        </asp:ContentPlaceHolder>
    </div>
    </form>
</body>
</html>

注意:

1.css文件的路径是相对于master页的.

2.js文件的路径是相当于内容页的.此时,我们使用的是绝对路径的方式来引用js文件.我们使用的是<%= Request.ApplicationPath%>/来获取路径.

特别注意:ApplicationPath和后面的%>/之间,不能有空格.

sub1.master的代码

<%@ Master Language="C#" MasterPageFile="~/masterpages/Main.Master" AutoEventWireup="true" 
    CodeBehind="Sub1.master.cs" Inherits="WebMasterTest.masterpages.Sub1" %>
<asp:Content ID="Content1" ContentPlaceHolderID="head" runat="server">
    <asp:ContentPlaceHolder ID="head" runat="server">
    </asp:ContentPlaceHolder>
</asp:Content>
<asp:Content ID="Content2" ContentPlaceHolderID="ContentPlaceHolder1" runat="server">
    <asp:Button ID="btn_sub" runat="server" Text="我是子母版页上的按钮" OnClientClick="myAlert('我是子母版页上的按钮');"  />
    <div class='myBack'>子模板页</div>
    <asp:ContentPlaceHolder ID="ContentPlaceHolder11" runat="server">
    </asp:ContentPlaceHolder>
    <asp:ContentPlaceHolder ID="ContentPlaceHolder12" runat="server">
    </asp:ContentPlaceHolder>
</asp:Content>

WebForm1.aspx内容页的代码:

<%@ Page Title="" Language="C#" MasterPageFile="~/masterpages/Sub1.master" AutoEventWireup="true" 
CodeBehind="WebForm1.aspx.cs" Inherits="WebMasterTest.pages.WebForm1" %>
<asp:Content ID="Content1" ContentPlaceHolderID="head" runat="server">
</asp:Content>
<asp:Content ID="Content2" ContentPlaceHolderID="ContentPlaceHolder11" runat="server">
</asp:Content>
<asp:Content ID="Content3" ContentPlaceHolderID="ContentPlaceHolder12" runat="server">
    <asp:Button ID="btn_page" runat="server" Text="这是内容页上的按钮" OnClientClick="myAlert('我是内容页上的按钮');" />
    <div class='myBack'>内容页</div>
    <img alt="" height="120" src="../css/images/成长的历程.jpg" width="120" />
</asp:Content>

此时,如果js或css的文件路径发生了变化,我们也只需变动main.master页面中的link路径即可.同时.我们在sub1.master页中也放置了id为head的contentPlaceHolder元素,这样,在webform1.aspx页中,用户也可以自行添加需要的js文件或函数.

我们可以看到,在这3个页面上的div中,我们均可以引用到class为myBack的css类.

那么我们如何在webform1.aspx页访问main.master和sub1.master页中的button呢.在webform1.aspx.cs中,代码如下:

protected void Page_Load(object sender, EventArgs e)
{
    //获取main.master
    var mainMaster = Page.Master.Master as MasterPage;

    //获取main.master页上的button
    var btnmaster = mainMaster.FindControl("btn_main") as Button;

    //获取sub1.master页的button
    //      这个有些特殊.不能通过Page.Master.FindControl("btn_sub")
    //      而应通过如下的方式,获取子母版页上的button
    var btnSub = mainMaster.FindControl("ContentPlaceHolder1")
        .FindControl("btn_sub") as Button;
}

如此,我们就实现了在内容页访问母版页的内容.

posted @ 2013-01-02 16:05  Localhost  阅读(6927)  评论(0编辑  收藏  举报