ASP.NET2.0快速入门(3)——使用母版页(转)

来源:互联网 发布:万方数据库网址 编辑:程序博客网 时间:2024/05/10 12:24
 

 

1.概述

Web程序开发中,一般一个网站都具有固定的格式。如下图是一种常用的格式,该页面分为3个部分。最上面为功能标题,如“学生信息维护”等显示给用户,以便用户明确自己在操作哪个模块。最下面显示作者或版权信息。中间是内容部分,主要实现本页的操作功能。

功能标题

内容页

作者:最后一只恐龙

在一个网站中,一般最下面一行整个网站的所有网页都一样,是不会改变的;功能标题则根据进入功能的不同更换显示文本;内容页则所有页面均不同。

在界面布局时,每个页面都设置那些相同的东西是一件比较恼人的工作。在asp.net 1.1中,一般使用用户自定义控件完成静态不变的内容,使用时把这个控件拖到这个位置就可以了。这种解决方案简化了页面布局,但一般用户对创建用户自定义控件还是有一定恐惧的,另外对于控件拖放的位置也要预留。而asp.net 2.0中提供了一种称为母版页的控件,较好的解决了这个问题。

使用母板页时,可以将不变部分放到母版页中,而创建的每个aspx页面,都可以选择母版页作为缺省显示方式,这样界面布局时只要关心内容页部分就可以了。

2.准备工作

创建一个名为MasterTest的网站,增加web.config配置文件。按照上篇文章ASP.NET2.0入门(2)——使用皮肤》中介绍的方法增加主题Default,并配置到web.config。当然增加和配置主题这一步不是本例必须的。

3.创建母板页

1)在“解决方案资源管理器”中的网站名称上点击右键,选择“添加新项”。

2)选择类别为“母版页”,文件名为MasterPage.master

添加后可以在该文件的源模式中看到这样一段代码:

        <asp:contentplaceholder id="ContentPlaceHolder1" runat="server">

        </asp:contentplaceholder>

在设计模式则可以看到该页增加了一个contentplaceholder控件。这个控件是2.0新增的一个控件,它的作用是起到一个占位符的作用,即这里需要有一个页面占据这个位置。

需要注意的一点是,母板页本身是不能在浏览器中显示运行的,它必须与一个aspx页面结合,由aspx页面把这个位置占据。

当然你也可以在这个页面中拖入多个contentplaceholder控件,在后面的页面中我们可以看到它们怎么与aspx页面结合起来。

现在我们希望看到的页面都居中,这样我们用table对其进行布局,在源模式下,将<div>标签中的代码(上面看到的那段)该成:

    <table width="100%" border="0" cellpadding="0" cellspacing="0">

        <tr><td height="20px"></td></tr>

        <tr>

            <td align="center">

                <asp:Label ID="Label1" runat="server" SkinID="PromptText" Text="母版页测试"></asp:Label>

            </td>

        </tr>

        <tr><td height="10px"></td></tr>

        <tr>

            <td align="center">

                <asp:contentplaceholder id="ContentPlaceHolder1" runat="server">

                </asp:contentplaceholder>

            </td>

        </tr>

        <tr><td height="10px"></td></tr>

        <tr>

            <td align="center">

                <asp:Label ID="Label2" runat="server" Text="作者:最后一只恐龙" SkinID="MsgText"></asp:Label>

            </td>

        </tr>

</table>

这段代码增加了两个Label,其中第一个显示“母版页测试”这个标题,最下面一个显示作者,中间还是原来的contentplaceholder控件。至于table的代码,可以通过dreamwaver进行配置,也可以直接敲入以上代码。

可以回到设计模式浏览配置好的界面。

4.增加内容页

1)在“解决方案资源管理器”中的网站名称上点击右键,选择“添加新项”。

2)选择类别为“Web窗体”,文件名为Default2.aspx,并在右下角“选择母版页”选项前打上勾(图4.1),添加。

3)这时弹出“选择母版页”对话框,选中MasterPage.master,确定。

我们看一下增加的default2.aspx的代码:

<%@ Page Language="C#" MasterPageFile="~/MasterPage.master" AutoEventWireup="true" CodeFile="Default2.aspx.cs" Inherits="Default2" Title="Untitled Page" %>

<asp:Content ID="Content1" ContentPlaceHolderID="ContentPlaceHolder1" Runat="Server">

</asp:Content>

最上面的Page声明中,MasterPageFile="~/MasterPage.master"表示引用了母版页MasterPage.master。下面增加了一个Content控件,该控件为内容页控件,也是一个容器控件,在内容页上增加的控件需要放入到Content控件中。

Content控件有一个属性ContentPlaceHolderID="ContentPlaceHolder1",可以看到这个ID正好是母版页中那个contentplaceholder控件的ID。如果你的母版页中有ncontentplaceholder

4.1 添加Web窗体

控件,则内容页中也应该有数量相等的Content控件,并且通过ContentPlaceHolderID属性将其通过ID关联起来。

4)在Content控件中拖人一个Calendar日历控件和一个Label控件。

5)将Label控件的ID改为lblTimeText属性改为“选中时间”。

6)为Calendar控件增加SelectionChanged事件。

这样,Default.aspx的源代码变成了:

<asp:Content ID="Content1" ContentPlaceHolderID="ContentPlaceHolder1" Runat="Server">

    <asp:Calendar ID="Calendar1" runat="server" OnSelectionChanged="Calendar1_SelectionChanged">

    </asp:Calendar>

    <asp:Label ID="lblTime" runat="server" Text="选中时间"></asp:Label>

</asp:Content>

7)进入后台Default.aspx.cs代码,在日历控件的SelectionChanged事件中增加以下代码:

    protected void Calendar1_SelectionChanged(object sender, EventArgs e)

    {

        lblTime.Text = Calendar1.SelectedDate.ToString();

    }

8)编译运行。

可以看到运行效果中,Default.aspx2中上下增加了母版页的内容。

5.在内容页中调用母版页控件

在内容页中有个属性Master,可以通过它访问母版页。如我们要修改母版页上的标题,我们看到显示标题的那个LabelIDLabel1,在Page_Load事件中增加以下代码:

    protected void Page_Load(object sender, EventArgs e)

    {

        if (!IsPostBack)

            ((Label)Master.FindControl("Label1")).Text = "标题被修改了!";

    }

运行看一下标题是否被修改。

6.嵌套母版页

有时可能会用到母版页的嵌套。如下是两种可能的母版页嵌套示意图,是不是两种设计方式都可以呢?

主母版页

子母版页

内容页

主母版页

子母版页

内容页

a

b

6.1 嵌套母版页示意图

因为不包含内容页的母版页是没有任何意义的,运行时也不会显示。而示意图b中的子母版页没有包含任何内容页,因此子母版页的内容不会显示。

内容页后台访问子母版页用Master属性,访问主母版页用Master.Master

(转自)http://blog.csdn.net/Ivy_zheng/archive/2007/03/13/1527454.aspx