内容页面访问母版页控件的两种方法

母版页是ASP.NET2.0新增的一个功能,使用它可以更方便、更快速的创建风格一致的应用程序。.NET的母版页和Dreamweaver的模板非常的相似,但.NET的母版页更加强大,它除了能够实现创建风格一致的应用程序这一基本功能外,还允许内容页和母版页进行"通信",下边我们就来看看如何在内容页中访问母版页的控件。

我们先来创建一个母版页MasterPage.master:
<%@ 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>内容页面访问母版页控件-Mzwu.Com</title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
        <table width="100%">
            <tr>
                <td colspan="2" style="height: 51px; text-align: center;">
                    Top</td>
            </tr>
            <tr>
                <td style="height: 459px">
                    <asp:ContentPlaceHolder ID="ContentPlaceHolder1" runat="server">
                    </asp:ContentPlaceHolder>
                </td>
                <td style="height: 459px">
                    <asp:ContentPlaceHolder ID="ContentPlaceHolder2" runat="server">
                    </asp:ContentPlaceHolder>
                </td>
            </tr>
            <tr>
                <td colspan="2" style="height: 44px; text-align: center;">
                    Bottom<br />
                    <asp:Label ID="Label1" runat="server" Text="Label"></asp:Label></td>
            </tr>
        </table>
    </div>
    </form>
</body>
</html>

MasterPage.master.cs:
using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;

public partial class MasterPage : System.Web.UI.MasterPage
{
    protected void Page_Load(object sender, EventArgs e)
    {
        Label1.Text = DateTime.Now.ToString();
    }

    //可读写Label1的Text属性
    public string LabelText
    {
        get { return Label1.Text; }
        set { Label1.Text = value; }
    }
}

1.使用FindControl访问母版页中的控件

Default.aspx:
<%@ Page Language="C#" MasterPageFile="~/Templates/MasterPage.master" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" Title="Untitled Page" %>
<asp:Content ID="Content1" ContentPlaceHolderID="ContentPlaceHolder1" Runat="Server">
    <asp:Label ID="Label1" runat="server" Text="Left"></asp:Label>
</asp:Content>
<asp:Content ID="Content2" ContentPlaceHolderID="ContentPlaceHolder2" Runat="Server">
    <asp:Label ID="Label2" runat="server" Text="Right"></asp:Label>
</asp:Content>

Default.aspx.cs:
using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;

public partial class _Default : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        //
    }

    /// <summary>
    /// 不能在Page_Load中访问母版页的控件,因为内容页比母版页先加载
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    protected void Page_LoadComplete(object sender, EventArgs e)
    {
        Label1.Text = ((Label)Master.FindControl("label1")).Text;
    }
}

2.使用MasterType指令访问母版页中的控件

Default.aspx:
<%@ Page Language="C#" MasterPageFile="~/Templates/MasterPage.master" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" Title="Untitled Page" %>
<%@ MasterType VirtualPath="~/Templates/MasterPage.master" %>
<asp:Content ID="Content1" ContentPlaceHolderID="ContentPlaceHolder1" Runat="Server">
    <asp:Label ID="Label1" runat="server" Text="Left"></asp:Label>
</asp:Content>
<asp:Content ID="Content2" ContentPlaceHolderID="ContentPlaceHolder2" Runat="Server">
    <asp:Label ID="Label2" runat="server" Text="Right"></asp:Label>
</asp:Content>

Default.aspx.cs:
using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;

public partial class _Default : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        //
    }

    /// <summary>
    /// 不能在Page_Load中访问母版页的控件,因为内容页比母版页先加载
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    protected void Page_LoadComplete(object sender, EventArgs e)
    {
        Label2.Text = Master.LabelText;
    }
}

说明:在内容页中使用MasterType指令后,将使得内容页中的Master属性被强类型化,也就是说,通过MasterType指令,可以创建与内容页相关的母版页的强类型引用。由此,可以在内容页中,使用Master对象访问母版页的公共方法、属性和控件等成员。

上边只是母版页的一点应用,有兴趣的朋友还可试试母版页的嵌套、动态加载母版页、以及实现自动针对不同的客户端使用不同的母版页。

评论: 0 | 引用: 0 | 查看次数: 4855
发表评论
登录后再发表评论!