在ASP.NET中动态设置主题

时间:2009-10-21 11:00:40

标签: asp.net themes

我有一个连接不同域的应用程序,而不是复制和修改每个应用程序,我在硬盘驱动器上使用相同的物理位置,但在IIS上使用单独的应用程序池和网站。

基本上我想根据主机名更改主题。即。用户来到“websome.com”获取“websome”主题,用户来到“jamessome.com”获得“jamessome”主题。

我在web.config“pages”属性中设置主题,该主题将全局主题应用于整个网站。有什么方法可以根据输入的域名使用来修改飞行设置吗?这可能是可能的,但是什么是缩小尺寸,为了简化解决方案,您建议如何处理小代码。据我所知,如果我每次用户进入时都会编辑web.config会花费大量时间而不是那么优雅......所以任何一个ASP.NET专家都可以编写两行代码,这样就会发生魔术?

网站上存在这些问题的解决方案很少,但这需要我在网站上的每个页面的Page_Init事件中添加代码,这是不切实际的。

1 个答案:

答案 0 :(得分:8)

实际上,必须在Page_PreInit中进行设置,如果您尝试更改Page_Init中的主题,它将无效。

最常见的解决方案是为所有页面使用父类。这是一次性更改,并将逻辑放在父类中。而不是继承自Page,而是继承自ThemedPage。在类ThemedPage内部,当然,它继承自Page本身,您可以覆盖Page.OnPreInit方法。

你要求“两行”,如果你删除杂乱,它实际上是一行。这是VB:

Public Class ThemedPage
    Inherits Page

    Protected Overrides Sub OnPreInit(ByVal e As System.EventArgs)
        Me.Theme = HttpContext.Current.Request.Url.Host.Replace(".com", "")
        MyBase.OnPreInit(e)
    End Sub
End Class

而不是这个:

Partial Class _Default
    Inherits System.Web.UI.Page
你现在写下这个:

Partial Class _Default
    Inherits ThemedPage

这就是全部!一次性搜索/替换,你就完成了。为了完整起见,这里是C#的相同(只有类):

// C# version
using System.Web;
using System.Web.UI;

public class ThemedPage : Page
{

    protected override void OnPreInit(System.EventArgs e)
    {
        this.Theme = HttpContext.Current.Request.Url.Host.Replace(".com", "");
        base.OnPreInit(e);
    }
}

更新: 添加了VB代码示例
更新:添加了C#代码示例

注意: 主题必须存在,否则会出现异常:Theme 'ThemeName' cannot be found in the application or global theme directories.。如果您想要默认主题或没有主题,如果主题不在那里,请将其包裹在try / catch块周围,并使用catch块来设置默认主题。