Asp.net 动态加载母版页
时间:2010-12-10 来源:花猫.NET
实现动态加载母版页的核心是设置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;
</td>
</tr>
<tr>
<td align="right" valign="bottom" style=" 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>