2012-01-26 15 views
5

Uczę się ASP.net i bawiłem się tematami i stronami wzorcowymi. Zdecydowałem, że chcę zmienić motyw strony i skorzystałem z rozwiązania web.config (dodając motyw do web.config). Teraz chcę mieć możliwość zmiany motywu na podstawie użytkownika i wybranego motywu przez użytkownika.Jak zmienić motyw strony internetowej asp (nie stronę) programowo i podczas wykonywania?

Nie mogę znaleźć żadnych samouczków, wszystkie wydają się pokazywać, jak zmieniać oddzielne strony treści, ale chcę zmienić cały temat witryny.

Jak to działa w najprostszy sposób? Nie jestem podłączony do atm bazy danych., To jest po prostu dla praktyki :)

Z poważaniem

+0

Motywy, strony wzorcowe, strony treści i web.config to asp.net, a nie klasyczny asp. Edytowałeś swoje tagi. –

+0

dziękuję, zapomniałem o tym :) –

+0

Istnieje wiele przykładów w Internecie, oto jeden: http://www.asp.net/web-forms/videos/how-do-i/how-do- i-create-user-selectable-themes-for-a-web-site Polecam po prostu przeszukiwać i wyglądać, Microsoft opublikował sporo – John

Odpowiedz

2

Tworzenie strony bazowy, który można dziedziczyć wszystkie strony z i ustawić motyw w przypadku 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(); 
    } 
} 

Poniżej ThemeSwitcher klasy narzędzie, które obsługuje pobierania/zapisywania aktualnego motywu wystawianie tematów . Ponieważ powiedziałeś, że nie korzystasz z bazy danych, możesz użyć Sesja:

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(); 
    } 
} 

Będziesz potrzebować strony, na której możesz zmienić temat. Dodaj dropdownlist z następującego kodu za:

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"); 
    }  
} 

Można pobrać przykładową aplikację here.

+1

dziękuję za kod, to było jedyne, co zadziałało, i wypróbowałem wszystkie powyższe tutoriale! Ławka w kościele! :) –

1

Widziałem to zrobione wcześniej przez dziedziczenie wszystkich stron od strony podstawy

public partial class _Default : BasePage 

i w ustawianiu motywu w klasie strony bazowej.

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

+1 Powinieneś ustawić motyw przed wywołaniem bazy.OnPreInit (e). Od MSDN "Właściwość Theme musi być ustawiona przed zdarzeniem PreInit, ustawienie właściwości kompozycji po zdarzeniu PreInit spowoduje wyjątek InvalidOperationException." – Lloyd

+0

Sprawdziłem http://msdn.microsoft.com/en-us/library/ie/tx35bd89.aspx zanim napisałem. Zmieniło się to ostatnio lub MSDN uzyskał sprzeczne informacje. –

+0

Oto interesujący artykuł, mówi "Po" zastosowano personalizację strony wydarzenia PreInit i motywy. Zdarzenie PreInit to wydarzenie na wczesnym etapie cyklu życia strony, do którego można uzyskać dostęp. Po zdarzeniu PreInit załadowane są informacje o personalizacji oraz temat strony, jeśli taki istnieje. – Lloyd

Powiązane problemy