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

时间:2008-08-18 21:17:16

标签: .net asp.net master-pages

我正在开发一个需要能够支持两个或更多外观的网站,在运行时可以变换。我希望能够通过CSS开关处理更改,但看起来我需要为每个设计使用不同的母版页。

那么,在运行时设置母版页的最佳方法是什么? Page.MasterPageFile只能在Page.OnPreInit事件中设置。看起来解决方案是让我的所有页面都从一个处理PreInit事件的公共基础继承,或者使用HttpModule这样做。

有什么建议吗?

6 个答案:

答案 0 :(得分:6)

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

答案 1 :(得分:2)

而不是两个不同的母版页如何让一个母版动态加载不同的用户控件和内容HTML文字呢?

答案 2 :(得分:2)

我感觉到你的痛苦。我搜索了大约一个小时(如果不是更多)的问题,没有成功。当你有数百个页面时,说“只是在每页上从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

答案 3 :(得分:1)

处理PreInit并插入加载正确母版页所需的一行代码就足够了。

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

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

答案 4 :(得分:0)

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

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

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

编辑:

另一个想法是,如果您只是尝试切换CSS,则将样式标记设置为在服务器上运行,并在运行时为其分配属性。这将再次需要使用单个母版页,并将代码置于母版页的代码隐藏之后,可能在PreInit事件处理程序中。

由于我从未实现过这个解决方案,所以我不确定整个&lt; HEAD&gt;标签必须在服务器上运行。


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

答案 5 :(得分: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";
    }
}