提问人:Jon Galloway 提问时间:8/19/2008 最后编辑:Jason BuntingJon Galloway 更新时间:8/29/2013 访问量:8766
在运行时设置 ASP.NET 母版页
Setting an ASP.NET Master Page at runtime
问:
我正在一个需要能够支持两种或更多外观的站点上工作,这些外观在运行时是可更改的。我希望能够使用 CSS 开关处理更改,但看起来我需要为每个设计使用不同的母版页。
那么,在运行时设置母版页的最佳方法是什么?Page.MasterPageFile 只能在 Page.OnPreInit 事件中设置。看起来解决方案是使我的所有页面都继承自处理 PreInit 事件的公共库,或者使用执行此操作的 HttpModule。
有什么建议吗?
答:
与其使用两个不同的母版页,不如让一个母版页动态加载不同的用户控件和内容 HTML 文本?
我以前做过一次,我完全按照你描述的做了(使所有页面都继承自具有 OnPreInit 事件的自定义页面)。此外,我在 Global.asax 中有一个自定义Application_PreRequestHandlerExecute.cs用于设置 Page.StyleSheetTheme 以执行不需要其他母版页的图像/css 更改。
处理 PreInit 并插入加载正确母版页所需的一行代码非常容易。
this.Page.MasterPageFile = "~/default.master";
在没有令人信服的理由不走这条路的情况下,这就是我会做的,无论你在哪里处理 PreInit。
我很好奇是什么决定了页面的外观?是用户单击按钮来更改主题吗?它是否基于用于访问站点的 URL?
母版页支持代码隐藏,因此您可以在一个母版页中放置一些逻辑来决定应显示的内容。
我见过几个网站根据用户点击设置cookie(以更改字体大小或页面宽度),然后根据这些cookie的值应用不同的CSS文件。如果不存在 Cookie,则显示默认外观。
编辑:
这里的另一个想法是,如果你只是想切换 CSS,那就是将你的样式标签设置为在服务器上运行,并在运行时为其分配属性。同样,这需要使用单个母版页,并将代码放在母版页的代码隐藏中,可能在 PreInit 事件处理程序中。
由于我从未实现过此解决方案,因此我不确定整个 <HEAD> 标签是否必须在服务器上运行。
<html>
<head id="Head" runat="server">
<style id="StylePlaceholder" runat="server" type="text/css"></style>
</head>
我能感受到你的痛苦。我搜索了大约一个小时(如果不是更多)的问题,但没有成功。当你有数百个页面时,说“只需在每个页面上从 PreInit 调用它”不仅仅是一个简单而枯燥的答案。但后来我意识到,我花在寻找解决方案上的时间比在每一页上都花更多的时间。
但是,我想根据 Profile 属性设置 MasterPageFile,因此每页大约有 5 行代码,这是可维护性的噩梦。无论如何,“不要重复自己”,对吧?
因此,我在 App_Code 文件夹中的模块中创建了一个 Extension 方法,以使其更简单、更易于维护。
Public Module WebFunctions
<System.Runtime.CompilerServices.Extension()> _
Public Sub SetMaster(ByVal page As Page)
Dim pb As ProfileCommon = DirectCast(HttpContext.Current.Profile, ProfileCommon)
If pb IsNot Nothing Then
page.MasterPageFile = pb.MasterPage
End If
End Sub
End Module
然后在每个页面的 PreInit 上,我只是这样称呼:
Protected Sub Page_PreInit(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.PreInit
Me.SetMaster()
End Sub
从基类继承所有页面,例如
public class PageBase : System.Web.UI.Page
{
public PageBase()
{
this.PreInit += new EventHandler(PageBase_PreInit);
}
void PageBase_PreInit(object sender, EventArgs e)
{
this.MasterPageFile = "~/MyMasterPage.Master";
}
}
评论