如何在运行时更改母版页






4.33/5 (2投票s)
本技巧将提供关于如何在运行时更改母版页、渲染控件以及访问其事件处理程序的完整知识。
引言
本技巧适用于那些正在寻找关于如何在运行时
更改母版页以及如何在运行时
渲染控件的基础/高级知识的人。这将允许用户保存他们的个人设置,就像在 gmail 中一样。
Using the Code
只需下载附件中的 zip 文件并解压缩。此应用程序是使用 ASP.NET 4.0 框架开发的。
解决方案资源管理器视图如下供您参考。
为所有母版页创建一个基类,命名为“BaseMaster
”。这将处理所有母版页的 Page_Load
事件。
using System.Web.UI.WebControls;
public class BaseMaster : System.Web.UI.MasterPage
{
protected void Page_Load(object sender, EventArgs e)
{
if (Request.RawUrl == "/Settings.aspx")
{
DropDownList drop = new DropDownList();
drop.ID = "DropDownThemes";
drop.Items.Add(new ListItem("Site1", "Site1.Master"));
drop.Items.Add(new ListItem("Site2", "Site2.Master"));
drop.Items.Add(new ListItem("Site3", "Site3.Master"));
drop.Enabled = true;
drop.AutoPostBack = true;
drop.SelectedIndexChanged += new EventHandler(this.drop_SelectedIndexChanged);
if (Session["MasterPage"] != null)
{
drop.SelectedValue = Session["MasterPage"].ToString();
}
try
{
((Site1)this).dropDownTheme = drop;
}
catch
{
try
{
((Site2)this).dropDownTheme = drop;
}
catch
{
((Site3)this).dropDownTheme = drop;
}
}
}
}
protected void drop_SelectedIndexChanged(object sender, EventArgs e)
{
try
{
Session["MasterPage"] = ((Site1)this).dropDownTheme.SelectedValue.ToString();
}
catch
{
try
{
Session["MasterPage"] = ((Site2)this).dropDownTheme.SelectedValue.ToString();
}
catch
{
Session["MasterPage"] = ((Site3)this).dropDownTheme.SelectedValue.ToString();
}
}
Response.Redirect(Request.Url.AbsoluteUri);
}
}
这里,我正在创建一个 DropDownList
控件并将其分配给 MasterPage
。Eventhandler
“SelectedIndexChanged
”被分配给它。
将此 BaseMaster
类继承到所有母版页,例如 Site1.Master
、Site2.Master
、Site3.Master
。
public partial class Site1 : BaseMaster
{
public DropDownList dropDownTheme
{
get { return (DropDownList)this.PlaceHolder1.FindControl("DropDownThemes"); }
set { PlaceHolder1.Controls.Add((DropDownList)value); }
}
}
请注意,我添加了一个 Public
属性“dropDownTheme
”。创建此属性是因为我在这里从“BaseMaster
”类而不是在同一个类“Site1
”中访问 dropdown
控件。
Site1
的 HTML 如下。相同的 HTML 也用于其余母版页(Site2.Master
和 Site3.Master
)。
<%@ Master Language="C#" AutoEventWireup="true"
CodeBehind="Site1.master.cs" Inherits="WebApplication4.MasterPages.Site1" %>
<!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>
<asp:ContentPlaceHolder ID="head" runat="server">
</asp:ContentPlaceHolder>
</head>
<body style="background-color: Aqua">
<form id="form1" runat="server">
This is Site 1 Master page
<table>
<tr>
<td style="text-align: left">
<h1>
This is Header</h1>
</td>
<td style="text-align: right; color: Red">
<a href="../../Settings.aspx"
id="LinkToSettings">Settings</a>
</td>
</tr>
<tr>
<td>
This is Menu section from Master<br />
<asp:PlaceHolder ID="PlaceHolder1"
runat="server"></asp:PlaceHolder>
</td>
<td>
<fieldset>
<legend>Content Page</legend>
<asp:ContentPlaceHolder ID="ContentPlaceHolder1"
runat="server">
</asp:ContentPlaceHolder>
</fieldset>
</td>
</tr>
<tr style="text-align: center">
<td colspan="2">
<small>All Rights Reserved with no one.</small>
</td>
</tr>
</table>
</form>
</body>
</html>
创建一个内容页“Settings.aspx”,HTML 如下
<%@ Page Title="" Language="C#"
MasterPageFile="~/MasterPages/Site1.Master" AutoEventWireup="true"
CodeBehind="Settings.aspx.cs" Inherits="WebApplication4.Settings" %>
<asp:Content ID="Content1" ContentPlaceHolderID="head" runat="server">
</asp:Content>
<asp:Content ID="Content2"
ContentPlaceHolderID="ContentPlaceHolder1" runat="server">
This is Settings Page with Master<br>
<asp:Button ID="btnBack" runat="server" Text="Back"
onclick="btnBack_Click" />
<asp:Button ID="btnReset" runat="server" Text="Reset"
onclick="btnReset_Click" />
</asp:Content>
在代码隐藏页中,添加以下事件
public partial class Settings : BasePage
{
protected void btnBack_Click(object sender, EventArgs e)
{
Response.Redirect("HomePage.aspx");
}
protected void btnReset_Click(object sender, EventArgs e)
{
Session["MasterPage"] = "Site1.Master" ;
Response.Redirect(Request.Url.AbsoluteUri);
}
}
这里,此下拉列表仅在Settings.aspx页面上渲染。如果有任何其他内容页,下拉列表将不会显示,因为只有设置页面被设计为允许这样做。
创建一个类文件并编写以下代码以选择母版页。
public class BasePage : System.Web.UI.Page
{
protected void Page_PreInit(object sender, EventArgs e)
{
if (Session["MasterPage"] != null)
{
MasterPageFile = WebConfigurationManager.AppSettings
["MasterFileFolder"] + Session["MasterPage"].ToString();
}
}
}
所有将使用母版页的网页都必须继承此类。这将处理所有页面的 Page_preInt
事件。
将母版页文件夹路径添加到.config 文件
<appSettings>
<add key="MasterFileFolder" value="~\MasterPages\"/>
</appSettings>
享受代码吧!:)