在開發過程中,簡單的實現內容頁僅綁定一個固定的主版頁面是遠遠不夠的,往往需要動態載入主版頁面。例如,要求網站提供多個可供選擇的頁面模板,並允許動態載入這些模板。
實現動態載入主版頁面的核心是設定MasterPageFile屬性值,需要強調的是應將該屬性設定在Page_PreInit事件處理常式中,因為Page_PreInit事件是頁面生命週期中較先引發的事件,如果試圖在Page_Load事件中設定MasterPageFile屬性將會發生頁面異常。
MasterPageFile 屬性
用於擷取或設定包含當前內容的主版頁面的名稱。
文法:
public string MasterPageFile { get; set; }
屬性值:當前主版頁面的父級主版頁面的名稱;如果當前主版頁面沒有父級,則為空白引用。
PreInit事件
在頁初始化開始時發生。
文法:
public event EventHandler PreInit
說明:PreInit事件是在頁生命週期的早期階段中可以訪問的事件。在PreInit事件後,將載入個人化資訊和頁面主題。
下面的執行個體實現了如何簡單動態載入主版頁面,程式開發步驟如下:
(1)建立一個網站,將其命名為15_02。
(2)在該網站的解決方案下,用滑鼠右鍵單擊網站名稱,在彈出的捷徑功能表中選擇“添加新項”命令,開啟“添加新項…”對話方塊,首先添加兩個主版頁面,分別命名為MasterPage和OtherMasterPage,然後添加一個基母片類BaseMaster,主要用於設定頁面的標題。
基母片類BaseMaster的原始碼如下:
public class BaseMaster : MasterPage//繼承MasterPage類
{
string _pageTitle = string.Empty;
public virtual String TitleName//通過virtual關鍵字定義屬性TitleName
{
get
{
return _pageTitle;
}
}
}
主版頁面MasterPage與主版頁面OtherMasterPage功能是完全一樣的,只是顯示的內容有所區別,因此下面只給出主版頁面MasterPage的原始碼。
<%@ Master Language="C#" Inherits="BaseMaster" %>
<script runat="server">
public override String TitleName
{
get
{
return "載入MasterPage.master";
}
}
void Page_Load(Object sender, EventArgs e)
{
if (!Page.IsPostBack)
{
string selItem = Request.QueryString["masterpage"];
ListItem item = DropDownList1.Items.FindByValue(selItem);
if (item != null)
{
item.Selected = true;
}
}
}
void SelectedMaster(Object sender, EventArgs e)
{
if (DropDownList1.SelectedValue == "other")
{
string url = Request.Path + "?masterpage=other";
Response.Redirect(url);
}
}
</script>
<html xmlns="http://www.w3.org/1999/xhtml">
<head id="Head1" runat="server">
<title></title>
</head>
<body leftmargin="0" topmargin="0">
<form id="form1" runat="server">
<div align="center">
<table height="100%" border="0" cellpadding="0" cellspacing="0"
bgcolor="#FFFFFF" style="width: 979px" background="images/部落格首頁面.JPG">
<tr>
<td align="right" valign="top" style="width: 887px; height: 168px">
</td>
</tr>
<tr>
<td align="right" valign="bottom" style="height: 53px; width: 887px;">
<div style="text-align: center">
<asp:DropDownList ID="DropDownList1" runat="server"
AutoPostBack="True" ValidationGroup="Master"
OnSelectedIndexChanged="SelectedMaster">
<asp:ListItem Value="default">預設主版頁面</asp:ListItem>
<asp:ListItem Value="other">動態主版頁面</asp:ListItem>
</asp:DropDownList>
</div>
</td>
</tr>
<tr>
<td align="right" valign="top" style="width: 887px">
</td>
</tr>
<tr>
<td valign="top" style="width: 887px">
<table width="100%" border="0" cellspacing="0" cellpadding="0">
<tr>
<td width="244" valign="top">
</td>
</tr>
</table>
<asp:ContentPlaceHolder ID="ContentPlaceHolder1" runat="server">
</asp:ContentPlaceHolder>
</td>
</tr>
<tr>
<td style="width: 887px" >
</td>
</tr>
<tr>
<td align="center" class="baseline" style="width: 887px"></td>
</tr>
</table>
</div>
</form>
</body>
</html>
內容頁Default的原始碼如下:<%@ Page Language="C#" %>
<%@ MasterType TypeName="BaseMaster" %>
<script runat="server">
void Page_PreInit(Object sender, EventArgs e)
{
if (Request.QueryString["masterpage"] == "other")
{ //設定當前頁面的MasterPageFile屬性、實現動態載入主版頁面
this.MasterPageFile = "OtherMasterPage.master";
}
else
{
this.MasterPageFile = " MasterPage.master";
}
this.Title = Master.TitleName;//設定當前頁的標題
}
</script>
<asp:content id="Content1" contentplaceholderid="ContentPlaceHolder1" runat="server">
<p> </p>
<h1 align=center>
動態載入主版頁面
</h1>
<p> </p><p> </p>
</asp:content>