本文轉自 http://whx.tzgt.gov.cn/newOperate/html/1/12/124/10711.html
為了減少在網頁設計時出現的變一頁則動全站的問題,vs2003升級到vs2005后增加了母版的概念。 你可以把它想像成為“網頁模版”,與之不同的是,再也不必每個頁面都去更新了,修改一次,所有的網頁都會改變,做到了一勞永逸。 下面先進行一個簡單的母版使用演示: 1、首先打開visual studio 2005,新建一個asp.net網站,文件系統,C#。 2、在解決方案資源管理器中,右鍵新建一個新項: 3、選擇母版頁:
4、打開MasterPage.master,里面有一個contentplaceholder控件,注意不要控件里面寫什么東西。 我們轉到設計視圖,在這個控件外面加上header和footer 兩句文本。
5、保存后我們就可以用它來做其它頁面了。有兩種方法,1是在母版頁任意位置右鍵,點擊添加內容頁;2 是在解決方案資源管理器上新建新項,在生成aspx頁面時勾選“選擇母版頁”
6、選擇相應的母版頁
7、在新生成的頁面源代碼只有這幾句:
|


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屬性值留空即可。
5.
在母版頁中使用javascript 時,使用javascript 獲得對象, 比如頁面現有一個TextBox控件 < asp:TextBox id="userName" runat="server"> 使用javascript var mm=document.all.userName; 報告的錯誤為對象為空或者對象不存在 查看生成的網頁的源碼,發現 ID 為userName 的TextBox 被解析為 < input name="_ctl0:_ctl0:DownStageMainContent:DownStagesubContent:userName" type="text" id="_ctl0__ctl0_DownStageMainContent_DownStagesubContent_userName" /> 原來加入母版頁后會在服務器控件的前面自動添加一個字符串,在這里是_ctl0__ctl0_DownStageMainContent_DownStagesubContent 客戶端的控件不受影響 如何獲得控件對象呢? 解決方法1 document.getElementById('< %=userName.ClientID %>')
解決方法2 < asp:Content ID="Content1" ContentPlaceHolderID="ContentPlaceHolder1" Runat="Server"> < script type="text/javascript"> function yanzheng() { var tt=document.getElementById("ctl00$ContentPlaceHolder1$mingzi"); tt.value=tt.value.replace(" ",""); if(tt.value=="") { window.alert("用戶名不能為空!"); return false; } tt=document.getElementById("ctl00$ContentPlaceHolder1$xx"); tt.value=tt.value.replace(" ",""); if(tt.value=="") { window.alert("密碼不能為空!"); return false; } } < /script> < asp:TextBox ID="mingzi" runat="server" MaxLength="10">< /asp:TextBox> < asp:TextBox ID="xx" runat="server" MaxLength="10">< /asp:TextBox> < input id="date" runat="server" maxlength="10" name="date" onclick="new Calendar().show(this);" readonly="readonly" size="10" type="text" /> < asp:Button ID="SaveInfo" runat="server" Text="添加" CssClass="but" OnClientClick="return yanzheng()" />
< /asp:Content>