2012-01-26 2 views
5

Sto imparando ASP.net e ho giocato con temi e pagine master. Ho deciso di voler cambiare il tema del sito Web e ho utilizzato la soluzione web.config (aggiungendo il tema a web.config). Quello che voglio fare ora è poter cambiare il tema in base all'utente e al tema selezionato dall'utente.Come modificare un tema di applicazione Web asp (non pagina) a livello di codice e durante il runtime?

Non sono riuscito a trovare alcun tutorial, tutti sembrano mostrare come modificare pagine di contenuti separate, ma voglio cambiare l'intero tema del sito.

Come si fa a farlo, nel modo più semplice? Io non sono collegato ad un atm database., È solo per la pratica :)

Saluti

+0

Temi, pagine master, pagine di contenuto e web.config sono asp.net e non asp classici. Modificato i tuoi tag. –

+0

grazie, me ne sono dimenticato :) –

+0

Ci sono molti esempi sul web, eccone uno: http://www.asp.net/web-forms/videos/how-do-i/how-do- i-create-user-selectable-themes-for-a-web-site Ti consiglio di cercare e cercare, Microsoft ha pubblicato un bel po 'di – John

risposta

2

Creare una pagina di base che si ereditano tutte le pagine da e impostare il tema in caso OnPreInit:

public class ThemePage : System.Web.UI.Page 
{ 
    protected override void OnPreInit(EventArgs e) 
    { 
     SetTheme();    

     base.OnPreInit(e); 
    } 

    private void SetTheme() 
    { 
     this.Theme = ThemeSwitcher.GetCurrentTheme(); 
    } 
} 

Di seguito si riporta la classe di utilità ThemeSwitcher che gestisce ricevendo/salvare il tema corrente e messa in vendita di temi . Dal momento che hai detto che non stai usando un database puoi usare Session:

public class ThemeSwitcher 
{ 
    private const string ThemeSessionKey = "theme"; 

    public static string GetCurrentTheme() 
    { 
     var theme = HttpContext.Current.Session[ThemeSessionKey] 
      as string; 

     return theme ?? "Default"; 
    } 

    public static void SaveCurrentTheme(string theme) 
    { 
     HttpContext.Current.Session[ThemeSessionKey] 
      = theme; 
    } 

    public static string[] ListThemes() 
    { 
     return (from d in Directory.GetDirectories(HttpContext.Current.Server.MapPath("~/app_themes")) 
       select Path.GetFileName(d)).ToArray(); 
    } 
} 

Vuoi una pagina in cui puoi cambiare il tema. Aggiungere una DropDownList con il seguente codice dietro:

public partial class _Default : ThemePage 
{ 
    protected void Page_Load(object sender, EventArgs e) 
    { 
     if (!Page.IsPostBack) 
     { 
      BindData(); 
     } 
    } 

    private void BindData() 
    { 
     var currentTheme = ThemeSwitcher.GetCurrentTheme(); 

     foreach (var theme in ThemeSwitcher.ListThemes()) 
     { 
      var item = new ListItem(theme); 
      item.Selected = theme == currentTheme; 
      ddlThemes.Items.Add(item); 
     } 
    } 

    protected void ddlThemes_SelectedIndexChanged(object sender, EventArgs e) 
    { 
     ThemeSwitcher.SaveCurrentTheme(ddlThemes.SelectedItem.Value); 
     Response.Redirect("~/default.aspx"); 
    }  
} 

È possibile scaricare l'applicazione di esempio here.

+1

grazie per il codice, è stata l'unica cosa che ha funzionato, e ho provato tutti i tutorial di cui sopra! Banco! :) –

1

Ho visto questo fatto prima ereditando tutte le pagine da una pagina di base

public partial class _Default : BasePage 

e nell'impostazione del tema nella classe della pagina di base.

public class BasePage : System.Web.UI.Page 
{ 
    protected override void OnPreInit(EventArgs e) 
    { 
     base.OnPreInit(e); 
     Page.Theme = //Your theme; 
    } 
} 
+0

+1 È necessario impostare il tema prima di chiamare la base.OnPreInit (e). Da MSDN "La proprietà Theme deve essere impostata prima dell'evento PreInit, l'impostazione della proprietà Theme dopo l'evento PreInit causerà un'eccezione InvalidOperationException." – Lloyd

+0

Ho controllato http://msdn.microsoft.com/en-us/library/ie/tx35bd89.aspx prima di pubblicare. È cambiato di recente o MSDN ha informazioni contrastanti. –

+0

Ecco un articolo interessante, dice "Dopo" la personalizzazione della pagina evento PreInit e i temi sono applicati. L'evento PreInit è un evento all'inizio del ciclo di vita della pagina a cui è possibile accedere. Dopo l'evento PreInit, vengono caricate le informazioni sulla personalizzazione e il tema della pagina, se presenti. – Lloyd

1

Date un'occhiata a questi documenti utili MSDN:

Walkthrough: Creating User-Selectable Themes

How to: Apply ASP.NET Themes Programmatically

controllare anche questo:

Master Pages and Themes

Scoping Themes

Non è possibile applicare direttamente un tema ASP.NET a una pagina master. Se aggiungi un attributo theme alla direttiva @ Master, la pagina solleverà un errore durante l'esecuzione.

+0

Leniel, le esercitazioni riguardano le pagine, non l'intero sito. Ma grazie comunque :) –