Dinamicamente definindo temas no ASP.NET
Pergunta
Eu tenho um aplicativo que diferentes domínios está conectado, em vez de copiar e modificar cada aplicação eu uso mesma localização física no disco rígido, mas pools de aplicativos separados e sites sobre IIS.
Basicamente eu quero mudar um tema baseado em hostname. ie. user trata de "websome.com" pega "websome" tema eo usuário chega a "jamessome.com" recebe tema "jamessome".
Eu defini o tema em web.config atributo "páginas" que se aplica o tema global para o site inteiro. Existe alguma maneira eu posso modificar essa configuração na mosca com base no uso de domínio digitado? É provavelmente possível, mas quais são downsizes eo que você sugere para fazer com pouco código, a fim de solução de simplificar. Como eu entendo, se editar i web.config cada usuário tempo vem em que vai demorar muito tempo que não é tão elegante ... Assim, qualquer ASP.NET gurus lá fora, pode escrever duas linhas de código tão mágico vai acontecer?
Existem algumas soluções para estes problemas no site, mas isso vai exigir-me para adicionar código para Page_Init caso de cada página no site que é irrealista.
Solução
Na verdade, ele deve ser definido em Page_PreInit
, não vai funcionar se você tentar alterar o tema em Page_Init
.
A solução mais comum é a utilização de uma classe pai para todas as suas páginas. Este é um one-time só mudam e coloca a lógica na classe pai. Em vez de herdar de Page
você, então herdar de, digamos, ThemedPage
. Dentro do ThemedPage
classe, que herda de si, claro Page
, você pode substituir o método Page.OnPreInit.
Você pediu "duas linhas", é realmente um se você remover a desordem. Esta é 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
E, em vez disso:
Partial Class _Default
Inherits System.Web.UI.Page
Você agora escrever isto:
Partial Class _Default
Inherits ThemedPage
Isso é tudo! A busca de uma só vez / substituir e está feito. Para sermos mais completos, aqui é o mesmo (somente a classe) para 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);
}
}
Atualização: VB adicionado amostra de código
Update: acrescentou C amostra # código
Nota: o tema deve existir, caso contrário, você receberá uma exceção: Theme 'ThemeName' cannot be found in the application or global theme directories.
. Se você quer um tema padrão ou nenhum tema, se o tema não está lá, envolvê-la em torno de um bloco de try
/ catch
e usar o bloco catch
para definir o tema padrão.