我希望从我的网站每次回发动态更改其母版页。
我写了这段代码
protected void Page_PreInit(object sender, EventArgs e)
{
if (IsPostBack)
MasterPageFile = (MapPath(this.MasterPageFile) == MapPath("MasterPage1.master"))?"MasterPage2.master":"MasterPage1.master";
}
但是当表单第一次发回时,主页面发生了变化,但第二次没有! 。我认为这是因为当页面重新加载时,主(第一个)主页面返回!! 我怎么能解决这个问题?
答案 0 :(得分:1)
问题是ASP.NET每次从头开始解析页面(即每个请求),并将主页面设置为.aspx标记中声明的页面。页面的先前状态在初始化阶段后加载,此时已经设置了母版页。这意味着如果页面声明包含类似
的内容<%@ Page ... MasterPageFile="MasterPage1.master" ... %>
然后PreInit
事件MasterPageFile
属性将始终设置为"MasterPage1.master"
,无论之前的母版页是什么。
使用您当前的代码,一切都是这样的。首次加载页面主文件时MasterPage1.master
,因此更改为MasterPage2.master
,一切都按预期工作。但是,第二个加载主文件仍然 MasterPage1.master
(因为它在.aspx中声明),因此它再次更改到MasterPage2.master
,并且看起来没什么变化。
要解决这个问题,请查看this answer。由于ViewState
上没有PreInit
,因此会在此处使用会话来决定应加载哪个母版页。您可能希望通过存储在会话之前的母版页中来扩展此代码。