65.9K
CodeProject 正在变化。 阅读更多。
Home

如何在运行时更改母版页

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.33/5 (2投票s)

2015 年 2 月 6 日

CPOL

1分钟阅读

viewsIcon

14098

downloadIcon

166

本技巧将提供关于如何在运行时更改母版页、渲染控件以及访问其事件处理程序的完整知识。

引言

本技巧适用于那些正在寻找关于如何在运行时更改母版页以及如何在运行时渲染控件的基础/高级知识的人。这将允许用户保存他们的个人设置,就像在 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 控件并将其分配给 MasterPageEventhandler SelectedIndexChanged”被分配给它。

将此 BaseMaster 类继承到所有母版页,例如 Site1.MasterSite2.MasterSite3.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>

享受代码吧!:)

© . All rights reserved.