How to Change Master Page @ Run-time
Introduction
This tip is for those who are looking for basic/advanced knowledge about how to change Master page @runtime
and how to render controls @ runtime
. This will allow user to save his/her personal settings just like in gmail.
Using the Code
Just download the attached zip file and extract it. This application is developed using ASP.NET 4.0 framework.
Solution explorer view is as below for your reference.
Create a Base class for all Master pages named "BaseMaster
". This will handle Page_Load
event of all Master Pages.
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);
}
}
Here, I am creating a DropDownList
control and assigning to MasterPage
. Eventhandler
"SelectedIndexChanged
" is assigned to the same.
Inherit this BaseMaster
class to all Master pages, say 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); }
}
}
Notice that I added a Public
property "dropDownTheme
". This property is created because here I am accessing the dropdown
control from "BaseMaster
" class not in same class "Site1
".
HTML of Site1
is here. Same HTML is used in remaining Master page also (Site2.Master
and 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>
Create a content page "Settings.aspx" HTML is below:
<%@ 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>
In the code behind page, add the below events:
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);
}
}
Here, this drop down will render only on Settings.aspx page. If there are any other content pages, dopdown will not be shown as only settings page is designed to allow so.
Create a Class file and write the below code to choose Master page.
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();
}
}
}
All the webpages which will use Master page have to inherit this class. This will handle Page_preInt
event for all pages.
Add a master page folder path to .config file:
<appSettings>
<add key="MasterFileFolder" value="~\MasterPages\"/>
</appSettings>
Enjoy the code.
License
This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)
Share
How to Change Master Page @ Run-time的更多相关文章
- 自定义SharePoint2013 master page
SharePoint uses templates to define and render the pages that a site displays. The structure of a Sh ...
- Creating a New Master Page in SharePoint 2013
Creating a New Master Page in SharePoint 2013 This article explains how to create a Master Page in S ...
- Adding a WebPart to a SharePoint 2013 Master Page 分类: Sharepoint 2015-07-08 01:03 7人阅读 评论(0) 收藏
On SharePoint 2013 you can not add the Web Parts to the master page the same way of 2010. Please use ...
- 通过SharePoint Designer对SharePoint 2010的Master Page进行自定制
1:需要在对应的SiteCollection 和 Site 中开启Publishing的服务 2:在Designer中创建自己的Master Page,进行对原始v4.master代码进行复制,和修改 ...
- sharepoint 2010 页面添加footer方法 custom footer for sharepoint 2010 master page
转:http://blog.csdn.net/chenxinxian/article/details/8720893 在sharepoint 2010的页面中,我们发现,没有页尾,如果我们需要给页面添 ...
- 转载 SharePoint 2013配置Master Page and Page Layout
转载原地址: http://www.cnblogs.com/huangjianwu/p/4539706.html 涉及到的内容是关于SharePoint 2013如何部署自定义的母版页和布局页. 进入 ...
- 【Sharepoint】CSS与Master Page的开发与部署
一.CSS的开发与部署相对比较简单,先是要上传CSS文件到样式库中,然后在页面模板中将上传的自定义CSS样式文件设置为所有文件的默认css文件.下面详细的介绍CSS文件的开发与部署过程. 1.编写自定 ...
- mysql change master导致gtid丢失
change master导致gtid丢失从innobackupex恢复导致binlog的拉取位置会导致主备gtid不一致.此类错误通过构造空事务方式无法修复.此时就需要change master 方 ...
- 安装Docker时错误提示 "could not change group /var/run/docker.sock to docker: group docker not found"的解决方案
安装Dock服务,主要命令是 yum install docker. 但是在启动的时候报错:warning msg="could not change group /var/run/doc ...
随机推荐
- DGA GAN——GAN在安全中的应用
DGA的模型:https://github.com/Yuren-Zhong/DeepDGA CNN.LSTM.双向LSTM 论文可以看https://openreview.net/pdf?id=BJL ...
- 内存保护机制及绕过方案——通过覆盖虚函数表绕过/GS机制
1 GS内存保护机制 1.1 GS工作原理 栈中的守护天使--GS,亦称作Stack Canary / Cookie,从VS2003起开始启用(也就说,GS机制是由编译器决定的,跟操作系统 ...
- L134
这种成功和后来的研究(表明记忆本身并不是先天决定的)使爱立信总结到,记忆的行为与其说是一种习得的行为不如说是一种先天的行为. 这点我们不清楚-构思物体和找出数字模型的能力,回答问题(最好的诗人和哲学家 ...
- react 学习文章
生命周期 学习笔记 一些坑 项目完成后总结 理解Immutable 是否要同构如何同构 react组件最佳实践 redux集合所有的state props来源, 页面所有状态 数据的唯一来源 reac ...
- TF随笔-3
>>> import tensorflow as tf>>> node1 = tf.constant(3.0, dtype=tf.float32)>>& ...
- mysql的5.6版本支持分区吗?
转载请注明出处:http://blog.csdn.net/dongdong9223/article/details/72291698 本文出自[我是干勾鱼的博客] 我们知道,查看mysql是否支持分区 ...
- VS2017 Product Key
Enterprise: NJVYC-BMHX2-G77MM-4XJMR-6Q8QF Professional: KBJFW-NXHK6-W4WJM-CRMQB-G3CDH
- (八)js函数二
1.变量 a)局部变量:在所有函数内部定义的变量,或者在函数内部未使用var声明的变量也属于全局变量. b)全局变量:在所有函数外部定义的变量. eg: 1) var a = 5,b = 4, ...
- SQL—数据分析
留存分析——左连接 矩阵分析——group by 结构分析:分析每种产品占据总销售量的比例 排序分析
- 为什么要编写轻量级的View Controller??
1.作为iOS项目中最大的文件,ViewControllers中的代码复用率几乎是最低的2.重量级的View COntroller加大了测试的复杂度.所以关注ViewController的瘦身,把业务 ...