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