16 Temmuz 2011 Cumartesi

Asp.Net'de Sayfa İçi Tema Değiştirme

Sitemizde, sayfanın görselliğini kullanıcıya bırakmak için,  tema değişikliği vs. gibi işlemler, son derece profesyonel ve göze hoş gelir. Şimdi, asp.net sayfalarında tema değişikliği nasıl yapılır bunu kısaca anlatmaya çalışacağım.

Öcelikle projemize sağ tıklayıp, add asp.net folder ve Theme diyip temamızı oluşturuyoruz. Temamızın içine css dosyası da ekledikten sonra basit olarak css'in içine arka plan rengi ve yazı rengi verelim. Örneğin bir mavi, bir de kırmızı temamız olsun. Bunun için şöyle bir css kodu yazalım,

Kırmızı Tema

body
{
    background-color:Red;
    color:White;
}

Mavi Tema

body
{
    background-color:Blue;
    color:White;
}

Şimdi de bu tema değişikliğini kullanıcıya bırakalım. Yani kullanıcı isterse Mavi, isterse kırmızı temayı kendi seçip kullansın. Bunun için bir dropdownlist koyup, kullanıcının seçimine göre değişikliği yapalım.

Öncelikle ilk akla gelen, dropdownlist'in autopostback özelliğini true yapıp, selectedindexchanged eventi tetiklendiğinde tema değişikliğini yapmak. Fakat bu işlemi yaptığımızda göreceğiz ki, uygulama şöyle bir exception fırlatacak;

The 'Theme' property can only be set in or before the 'Page_PreInit' event.

Bunun anlamı, LifeCycle süreci bazı sırayla gerçekleşir. Sayfa oluşurken, 

  • Constructor
  • PreInit
  • Init
  • Load
  • PreRender
  • UnLoad
metotları sırasıyla çalışır ve sayfa oluşur. Dolayısıyla, tema atama, setleme işlemleri de PreInit'de gerçekleştiğinden burada da PreInit metodumuzu yazıp, Temayı setleyelim.

    protected void Page_PreInit(object sender, EventArgs e)
    {
        Theme = DropDownList1.SelectedValue;
    }


Bu kodu yazdığımızda da şöyle bir sorun çıkar. Asp.Net kontrolleri Load eventinden önce oluşur fakat markuptaki halleriyle oluşur. Yani boş bir şekilde sadece DropDownList'in oluştuğunu görürüz. Load metodunda içi dolar. Dolayısıyla PreInit, Load'dan önce çalıştığından hata verecektir. Peki Load eventinden önce kontrollerin değerlerine nasıl erişiriz.

Cevap, Request nesnesi sayesinde. Aslında Load'da da Request ile erişebiliriz fakat, Visual Studio uzun uzun yazmayalım diye, öyle bir kolaylık sağlamış bize DropDownList oluştuğu için. Dolayısıyla PreInit'den seçilen değeri alabilmemiz için şu kodu yazmalıyız;

    protected void Page_PreInit(object sender, EventArgs e)
    {
        if(Request.RequestType == "POST")
        {
            Theme = Request.Form["DropDownList1"];
        }       
    }

kodu RequestType'ını kontrol etmemizin amacı, get taleplerinde var olan temayı default olarak vermek. Yani sayfa ilk açıldığında boş bir template ile açılsın, daha sonra dropdownlist post edildiğinde içindeki değer PreInit metodunda okunsun ve temamız değişsin. Ekran çıktısına baktığımızda ise şöyle bir sonuç görürüz;



0 yorum: