asp.net 2.0教程 主版頁面

來源:互聯網
上載者:User

尊重作者,請保留 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新特性:主題和皮膚

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.