2008-08-18 36 views
8

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

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

有什么建议吗?

回答

6

我已经做过一次之前,我做了你所描述的(使所有的页面从一个OnPreInit事件的自定义页面继承)。此外,我在我的Global.asax.cs中有一个自定义的Application_PreRequestHandlerExecute,用于设置Page.StyleSheetTheme用于执行不需要其他主页面的image/css更改。

2

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

1

处理PreInit并插入加载正确主页所需的一行代码非常简单。

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

在没有一些令人信服的理由不走这条路,那就是我想要做的,无论在哪里你处理PreInit的。

0

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

母版页支持后面的代码,所以你可以在你的一个母版页中放一些逻辑来决定应该显示什么。

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

编辑:

另一个想到这里,如果你只是想转出CSS是设置你的风格标签在服务器上运行,并在运行时的属性分配给它。再次,这需要使用一个主页面,并将代码放在主页面的代码隐藏中,可能在PreInit事件处理程序中。

因为我从来没有实现过这个解决方案,所以我不确定是否整个<标头都必须在服务器上运行。


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

我感到你的痛苦。我搜索了大约一个小时(如果不是更多),对于这个问题,没有成功。当您拥有数百页时,说“只需从每个页面上的PreInit调用它”不仅仅是一个简单而干燥的答案。但后来我意识到,我花了更多时间寻找解决方案,而不是在每个页面上都做这件事。

但是,我想根据配置文件属性设置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 
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"; 
    } 
}