http://msdn.microsoft.com/zh-cn/library/wtxbf3hh.aspx
1,創(chuàng)建模板頁
1)首先我們先建立一個網(wǎng)站(圖一),
2)在此項(xiàng)目上添加一個模板頁,在網(wǎng)站上“右擊鼠標(biāo)”,選擇“添加新相”,找到“模板頁”(圖二),名稱自己定,語言當(dāng)然就不用說了,然后點(diǎn)擊添加就可以了!
3)現(xiàn)在我們再仔細(xì)的看一下這個模板頁到底有什么功能,到底有什么神秘之處!我們雙擊如圖所示的MasterPage.master文件,查看其 原文件,我們首先看到第一行就是“<%@ Master Language="C#" AutoEventWireup="true" CodeFile="MasterPage.master.cs" Inherits="MasterPage" %>”,這句話是模板頁的聲明,如果我們仔細(xì)一點(diǎn)的話就會發(fā)現(xiàn),它的聲明和普通頁面的聲明很相似,主要有一下幾點(diǎn):1、模板頁是以master開始,后綴是“.master”,而普通的頁面是以page開始的,后綴是“.aspx”,再一個很大的區(qū)別就是:在模板頁中存在一個“ContentPlaceHolder”控件,這個控件就是用來填充內(nèi)容頁的地方,而普通的頁面是沒有的!(圖四)我們可以在模板頁的地方添加各種固定的信息如頁面的logo或者是聲明等!現(xiàn)在我們?yōu)檫@個模板頁添加一個內(nèi)容頁,來看一下效果。
具體操作如下:我們在內(nèi)容頁的位置右擊鼠標(biāo),選擇“添加內(nèi)容頁”(圖六)就可以。此時(shí),我們會看到內(nèi)容頁的源碼區(qū),及其簡單,就三句話。
其中“MasterPageFile="~/MasterPage.master"”這句話是定義是模板頁,
再看下一行“<asp:Content ID="Content1" ContentPlaceHolderID="ContentPlaceHolder1" Runat="Server">
</asp:Content>”,
“ContentPlaceHolderID="ContentPlaceHolder1"”為我們指定了模板頁中的可以添加內(nèi)容頁的ContentPlaceHolder,有時(shí)候我們的模板頁會不只有一個ContentPlaceHolder,我們要根據(jù)自己的需要來選擇!我們選擇“設(shè)計(jì)”模式,來看一下效果,只有內(nèi)容頁的地方允許我們編輯,這就實(shí)現(xiàn)了模板頁的作用!假如我們的內(nèi)容頁也想利用模板頁的內(nèi)容,我們可以點(diǎn)擊ContentPlaceHolder右上角的那個小三角,然后選擇“默認(rèn)為模板頁內(nèi)容就可以了”(圖八)!
在母版頁中,可以添加多個ContentPlaceHolder控件,通過在工具箱的標(biāo)準(zhǔn)欄中選擇ContentPlaceHolder,拖動到母版頁中。在ContentPlaceHolder區(qū)域中,也可以直接輸入內(nèi)容或添加ASP.NET控件,ContentPlaceHolder區(qū)域中的內(nèi)容將作為內(nèi)容頁的默認(rèn)內(nèi)容呈現(xiàn)。
2,使用模板頁
1),選擇網(wǎng)站名稱,并單擊右鍵,選擇“添加新項(xiàng)”命令,在模板列表中選擇“WEB窗體”。在添加新項(xiàng)窗體的右下角有兩個復(fù)選框。確保選中“選擇母版頁”,復(fù)選框。如圖:
3),保存后,在新建的WEB頁,即內(nèi)容頁。在顯示的時(shí)候會把母版面的內(nèi)容一起以水印淡化的形式顯示出來,而在母版頁中的ContentPlaceHolder控件區(qū)域會被內(nèi)容頁面中的Content控件替換,如圖:
一、在母版頁中編寫后臺代碼,訪問母版頁中的控件:
與普通的aspx頁面一樣,雙擊按鈕即可編寫母版頁中的代碼
二、在內(nèi)空頁面中編寫后臺代碼,訪問內(nèi)容頁面中的控件:
與普通的aspx頁面一樣,雙擊按鈕即可編寫母版頁中的代碼
三、在內(nèi)容頁面中編寫代碼訪問母版頁中的控件:
在內(nèi)容頁面中有個Master對象,它是MasterPage類型,它代表當(dāng)前內(nèi)容頁面的母版頁。通過這個對象的FindControl方法,我們可以找到母版面中的控件,這樣就可以在內(nèi)容頁面中操作母版頁中的控件了。
TextBox txt = (TextBox)((MasterPage)Master).FindControl("txtMaster");
txt.Text = this.txtContent1.Text; ;
四、在內(nèi)容頁面中編寫代碼訪問母版頁中的屬性和方法:
仍可能通過Master對象進(jìn)行訪問,只不過在這里要把Master對象轉(zhuǎn)換成具體的母版頁類型,然后再調(diào)用母版頁中的屬性和方不法。
這里要說明的是:母版頁中要被內(nèi)容頁面調(diào)用的屬性和方法必須是Public修改的。否則無法調(diào)到。
假設(shè)母版頁中有下面的屬性和方法:
public string TextValue
{
get
{
return this.txtMaster.Text;
}
set
{
this.txtMaster.Text = value;
}
}
public void show(string str)
{
txtMaster.Text = str;
}
在內(nèi)容頁面中可以通過下代的代碼來實(shí)現(xiàn)對母版頁中方法的調(diào)用:
((MasterPage_MP)Master).show(this.txtContent1.Text);
((MasterPage_MP)Master).TextValue = this.txtContent1.Text;
五、在母版頁中訪問內(nèi)容頁面的控件:
在母版頁中可以通過在ContentPlaceHolder控件中調(diào)用FindControl方法來取得控件,然后對控件進(jìn)行操作。
((TextBox)this.ContentPlaceHolder1.FindControl("txtContent1")).Text = this.txtMaster.Text;
六、在母版頁中訪問內(nèi)容頁面中的方法和屬性:
在母版頁中調(diào)用子頁面中的屬性和方法有點(diǎn)難度,因?yàn)槲覀儫o法像上一步中那樣通過FindControl來找到方法和屬性。
于是我們想到在母版面的聲明指示符中加入下面的代碼:
<%@ Reference Page="~/MasterPage/Show1.aspx" %>
在運(yùn)行的時(shí)候回發(fā)現(xiàn)有錯誤,錯誤的內(nèi)容是“無法實(shí)現(xiàn)循環(huán)引用”。這是因?yàn)槟J(rèn)在子頁面中引用了母版頁,你也就不能再在母版頁中引用子頁面了。
我在網(wǎng)上也沒找到更好的解決方法,但這使我們想起C#是的“反射”,它可以使我們動態(tài)獲取頁面對象,并且可以調(diào)用它的屬性和方法。
代碼如下:
Type t = this.ContentPlaceHolder1.Page.GetType();
PropertyInfo pi = t.GetProperty("ContentValue"); //獲取ContentValue屬性
pi.SetValue(this.ContentPlaceHolder1.Page,this.txtMaster.Text,null); //給屬性賦值
MethodInfo mi = t.GetMethod("SetValue"); //獲取SetValue()方法
object[] os = new object[1]; //建造輸入?yún)?shù)
os[0] = txtMaster.Text;
mi.Invoke(this.ContentPlaceHolder1.Page, os); //調(diào)用SetValue方法
七、在有多個內(nèi)容頁面使用母版面的情況下,在母版頁中根據(jù)不同的內(nèi)容頁面實(shí)現(xiàn)不同的操作
在母版頁中可以加入多個不同的內(nèi)容頁面,但在設(shè)計(jì)期間,我們無法知道當(dāng)前運(yùn)行的是哪個內(nèi)容頁面。所以只能通過分支判斷當(dāng)前運(yùn)行的是哪個子頁面,來執(zhí)行不同的操作。這里也用到了反射的知識。
代碼如下:
string s = this.ContentPlaceHolder1.Page.GetType().ToString(); //取出內(nèi)容頁面的類型名稱
if (s == "ASP.default17_aspx") //根據(jù)不同的內(nèi)容頁面類型執(zhí)行不同的操作
{
((TextBox)this.ContentPlaceHolder1.FindControl("TextBox2")).Text = "MastPage";
}
else if (s == "ASP.default18_aspx")
{
((TextBox)this.ContentPlaceHolder1.FindControl("TextBox2")).Text = "Hello MastPage";
}
八、在母版面與內(nèi)容頁面中JS代碼的操作
在母版頁或內(nèi)容頁面中的控件運(yùn)行之后會自動生成ID,如文本框的ID是txtContent1,在運(yùn)行之后ID會自動變?yōu)閏tl00_ContentPlaceHolder2_txtContent1,name屬性會變?yōu)閏tl00$ContentPlaceHolder2$txtContent1。
在JS代碼中,我們用document.getElementById()方法,根據(jù)id取得控件對象的時(shí)候,應(yīng)當(dāng)使用ctl00_ContentPlaceHolder2_txtContent1這個ID名,否則會產(chǎn)生“未找到對象”的異常。
(車延祿)
母版頁運(yùn)行機(jī)制
母版頁僅僅是一個頁面模板,單獨(dú)的母版頁是不能被用戶所訪問的。單獨(dú)的內(nèi)容頁也不能夠使用。母版頁和內(nèi)容頁有著嚴(yán)格對應(yīng)關(guān)系。母版頁中包含多少個ContentPlaceHolder控件,那么內(nèi)容頁中也必須設(shè)置與其相對應(yīng)的Content控件。當(dāng)客戶端瀏覽器向服務(wù)器發(fā)出請求,要求瀏覽某個內(nèi)容頁面時(shí),ASP.NET引擎將同時(shí)執(zhí)行內(nèi)容頁和母版頁的代碼,并將最終結(jié)果發(fā)送給客戶端瀏覽器。
母版頁和內(nèi)容頁的運(yùn)行過程可以概括為以下5個步驟。
(1)用戶通過鍵入內(nèi)容頁的URL來請求某頁。
(2)獲取內(nèi)容頁后,讀取@ Page指令。如果該指令引用一個母版頁,則也讀取該母版頁。如果是第一次請求這兩個頁,則兩個頁都要進(jìn)行編譯。
(3)母版頁合并到內(nèi)容頁的控件樹中。
(4)各個Content控件的內(nèi)容合并到母版頁中相應(yīng)的ContentPlaceHolder控件中。
(5)呈現(xiàn)得到結(jié)果頁。
母版頁和內(nèi)容頁事件順序
(1)母版頁中控件Init事件;
(2)內(nèi)容頁中Content控件Init事件;
(3)母版頁Init事件;
(4)內(nèi)容頁Init事件;
(5)內(nèi)容頁Load事件;
(6)母版頁Load事件;
(7)內(nèi)容頁中Content控件Load事件;
(8)內(nèi)容頁P(yáng)reRender事件;
(9)母版頁P(yáng)reRender事件;
(10)母版頁控件PreRender事件。
(11)內(nèi)容頁中Content控件PreRender事件。
使用母版頁的優(yōu)點(diǎn):
(1)有利于站點(diǎn)修改和維護(hù),降低開發(fā)人員的工作強(qiáng)度
(2)有利于實(shí)現(xiàn)頁面布局
(3)提供一種便于利用的對象模型
http://blog.csdn.net/steveyang/archive/2008/09/16/2932490.aspx Dreamweaver模板的使用
http://jcobra.blog.163.com/blog/static/470493200966287962/
聯(lián)系客服
微信登錄中...
請勿關(guān)閉此頁面