2009-10-21 66 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