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

9
我正在开发一个网站,需要在运行时支持两种或更多的外观。我原本希望能够使用CSS切换来处理变化,但看起来我需要为每个设计使用不同的主页面。
那么,在运行时设置主页面的最佳方法是什么?Page.MasterPageFile只能在Page.OnPreInit事件中设置。解决方案似乎是让所有页面继承自一个公共基类,该基类处理PreInit事件,或者使用一个HttpModule来处理它。
有什么建议吗?
6个回答

6

我以前做过这件事,我完全按照你所描述的方式操作(使所有页面都继承自具有OnPreInit事件的自定义页面)。此外,我在Global.asax.cs中拥有一个自定义的Application_PreRequestHandlerExecute,用于设置Page.StyleSheetTheme以进行不需要不同Master Page的图像/ CSS更改。


2
我理解您的苦恼。我花了大约一个小时(甚至更长时间)寻找关于这个问题的解决方案,但最终没有成功。当你有数百个页面时,不能简单地说“只需在每个页面的PreInit中调用它”来回答这个问题。但后来我意识到,我花在寻找解决方案上的时间比在每个页面上执行代码所需要的时间更多。
然而,我想基于Profile属性设置MasterPageFile, 这将导致每个页面都需要编写5行代码,这是对可维护性的一种威胁。而且,“不要重复自己”,对吧?
因此,我在App_Code文件夹的一个模块中创建了一个扩展方法,使这个过程更容易和可维护。
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

2

不要使用两个不同的母版页,而是使用一个母版页动态加载不同的用户控件和内容HTML文本。


1

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

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

如果没有什么强烈的理由不选择这条路,那就按照这种方式去做,无论你在哪里处理PreInit。


0

像这样从一个基类继承所有页面:

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

0

我好奇是什么决定了页面的外观?是用户点击按钮改变主题?还是基于用来访问网站的URL?

Master Pages支持Code behind,因此您可以在一个Master Page中放置一些逻辑来决定应该显示什么。

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

编辑:

另一个想法是,如果您只是想切换 CSS,则将样式标签设置为在服务器上运行,并在运行时分配属性。再次需要使用单个 Master Page,并将代码放置在 Master Page 的 code-behind 中,可能在 PreInit 事件处理程序中。

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


<html>
<head id="Head" runat="server">
<style id="StylePlaceholder" runat="server" type="text/css"></style>
</head>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接