2009-10-21 51 views
4

我有一个应用程序连接到不同的域,而不是复制和修改每个应用程序,我在硬盘上使用相同的物理位置,但在IIS上分开应用程序池和网站。在ASP.NET中动态设置主题

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

我在web.config的“pages”属性中设置主题,该属性将主题全局应用于整个网站。有没有什么办法可以修改该设置基于从域使用输入?这可能是可能的,但是什么是缩小规模,以及为了简化解决方案,你建议用少量代码做什么。据我了解,如果我编辑web.config每次用户进来,它将需要很多时间,这不是那么优雅......所以任何ASP.NET大师可以写出两行代码,这样的魔法会发生?

这些问题在网站上很少有解决方案,但这会要求我向网站上每一页的Page_Init事件添加代码,这是不现实的。

回答

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区块设置默认主题。

+0

有趣的方法。 – 2009-10-21 11:07:13

+0

谢谢,队友...会尝试应用它 – eugeneK 2009-10-21 11:17:19

+0

太棒了,非常感谢你! :) – 2009-10-21 11:44:00