母版頁給我們帶來了很多方便性,但也帶來了一個問題:在設計母版頁的時候,總會碰到需要在母版頁中調用內容頁的方法,但此時內容頁尚未設計,如何調用呢?下面就讓我用一個實例給大家講解一下:
母版頁:MasterPage.master的頁面代碼如下:
<body>
<form id="form1" runat="server">
<table>
<tr>
<td>
<asp:Button ID="CallContentMethod" runat="server" OnClick="CallContentMethod_Click"
Text="調用內容頁方法" />
<asp:Label ID="welcomeMessage" runat="server" Text="這裏將顯示內容頁的歡迎信息"></asp:Label></td>
</tr>
<tr>
<td>
<asp:contentplaceholder id="ContentPlaceHolder1" runat="server">
</asp:contentplaceholder>
</td>
</tr>
</table>
</form>
</body>
其中有一個按鈕和一個文本,其中的文本用來顯示內容頁的歡迎信息,按鈕用來調用內容頁的方法,但此時內容頁並不存在,那麼按鈕的單擊事件代碼如何寫呢?
這裏我們需要引入一個頁面基類的概念,想必大家都清楚;aspx頁面只要求後臺類是繼承此Page類即可。所以我們先添加一個繼承自Page的頁面基類BasePage,然後讓頁面繼承自我們BasePage並重寫相關方法,利用運行時的動態性來解決此問題。相關代碼如下:
BasePage.cs:
public class BasePage :Page
{
/// <summary>
/// 輸出每個內容頁的歡迎信息,內容頁繼承此類並重寫此方法即可。此方法會由母版頁自動調用
/// </summary>
public virtual string SayHello()
{
return "這是頁面基類返回的歡迎信息!";
}
}
母版頁的後臺代碼如下:
BasePage currentPage = null;
protected void Page_Load(object sender, EventArgs e)
{
currentPage = Page as BasePage;
}
protected void CallContentMethod_Click(object sender, EventArgs e)
{
if (currentPage != null)
{
welcomeMessage.Text = currentPage.SayHello();
}
}
此處母版頁中定義一個成員變量指向BasePage,在PageLoad中將實際運行的頁面進行轉型,這樣在按鈕的單擊事件中就可以調用BasePage定義的SayHello方法了。又由於此方法是虛方法,在運行時綁定具體方法,即可實現我們的要求。
下面是內容頁的代碼:
Default.aspx.cs:
//注意類一定要繼承自自定義的基類,否則母版頁中轉型會失敗
public partial class Template_Default : BasePage
//重寫歡迎信息方法
public override string SayHello()
{
return "這是來自內容頁的歡迎信息!";
}
。
通過以上的步驟,我們就可以輕鬆實現在母版頁中調用內容頁的方法。如果想自動調用,只需要在母版頁的Page_Load方法中轉型後直接調用相關方法即可。
如果大家有更好的方法歡迎一起討論!!!