在运行时设置 ASP.NET 母版页

Setting an ASP.NET Master Page at runtime

提问人:Jon Galloway 提问时间:8/19/2008 最后编辑:Jason BuntingJon Galloway 更新时间:8/29/2013 访问量:8766

问:

我正在一个需要能够支持两种或更多外观的站点上工作,这些外观在运行时是可更改的。我希望能够使用 CSS 开关处理更改,但看起来我需要为每个设计使用不同的母版页。

那么,在运行时设置母版页的最佳方法是什么?Page.MasterPageFile 只能在 Page.OnPreInit 事件中设置。看起来解决方案是使我的所有页面都继承自处理 PreInit 事件的公共库,或者使用执行此操作的 HttpModule。

有什么建议吗?

.NET asp.net 母版页

评论


答:

2赞 Keith 8/19/2008 #1

与其使用两个不同的母版页,不如让一个母版页动态加载不同的用户控件和内容 HTML 文本?

6赞 thelsdj 8/19/2008 #2

我以前做过一次,我完全按照你描述的做了(使所有页面都继承自具有 OnPreInit 事件的自定义页面)。此外,我在 Global.asax 中有一个自定义Application_PreRequestHandlerExecute.cs用于设置 Page.StyleSheetTheme 以执行不需要其他母版页的图像/css 更改。

1赞 user2189331 8/19/2008 #3

处理 PreInit 并插入加载正确母版页所需的一行代码非常容易。

this.Page.MasterPageFile = "~/default.master";

在没有令人信服的理由不走这条路的情况下,这就是我会做的,无论你在哪里处理 PreInit。

0赞 Brian G Swanson 8/19/2008 #4

我很好奇是什么决定了页面的外观?是用户单击按钮来更改主题吗?它是否基于用于访问站点的 URL?

母版页支持代码隐藏,因此您可以在一个母版页中放置一些逻辑来决定应显示的内容。

我见过几个网站根据用户点击设置cookie(以更改字体大小或页面宽度),然后根据这些cookie的值应用不同的CSS文件。如果不存在 Cookie,则显示默认外观。

编辑:

这里的另一个想法是,如果你只是想切换 CSS,那就是将你的样式标签设置为在服务器上运行,并在运行时为其分配属性。同样,这需要使用单个母版页,并将代码放在母版页的代码隐藏中,可能在 PreInit 事件处理程序中。

由于我从未实现过此解决方案,因此我不确定整个 <HEAD> 标签是否必须在服务器上运行。


<html>
<head id="Head" runat="server">
<style id="StylePlaceholder" runat="server" type="text/css"></style>
</head>
2赞 Paul 2/24/2009 #5

我能感受到你的痛苦。我搜索了大约一个小时(如果不是更多)的问题,但没有成功。当你有数百个页面时,说“只需在每个页面上从 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
0赞 H.M. 8/29/2013 #6

从基类继承所有页面,例如

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";
    }
}