代码之家  ›  专栏  ›  技术社区  ›  Jon Galloway

设置ASP。NET运行时母版页

  •  9
  • Jon Galloway  · 技术社区  · 17 年前

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

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

    有什么建议吗?

    6 回复  |  直到 17 年前
        1
  •  6
  •   thelsdj    17 年前

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

        2
  •  2
  •   Keith    17 年前

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

        3
  •  2
  •   Paul    16 年前

    我能感觉到你的痛苦。我搜索了大约一个小时(如果不是更长的话)来寻找这个问题,但没有成功。当你有数百个页面时,说“只需在每个页面上从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
    
        4
  •  1
  •   user2189331 user2189331    17 年前

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

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

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

        5
  •  0
  •   Brian G Swanson    17 年前

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

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

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

    编辑:

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

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

    
    <html>
    <head id="Head" runat="server">
    <style id="StylePlaceholder" runat="server" type="text/css"></style>
    </head>
    
        6
  •  0
  •   H.M.    12 年前

    从基类继承所有页面,如

    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";
        }
    }
    
    推荐文章