İstemci (Client) Tabanlı Durum Kontrolleri

Eyl 06, 2013
  1. Viewstate (Görüntü Durumu)

    Viewstate, bir ASP.NET sayfasında geri yükleme (post back) işlemi gerçekleştiğinde sayfa içerisindeki kontrollerin özelliklerinin ve içerdiği değerlerin saklanarak sunucuya gönderilmesini sağlar. Viewstate nesnesi varsayılan olarak belirtilmese bile, işlem gerçekleştiği sırada kontrollere ait bilgiler sunucu tarafında HTML kodları üretilirken şifrelenmiş olarak viewstate içerisinde depolanır. Sunucu kendisine gelen sayfadaki viewstate değerlerini işler ve sonucu alır. Sayfa istemciye geri yollanırken, tarayıcı üzerinde yeniden kontrollerin bilgilerine ve işlenmiş olan verilere ulaşılması sağlanır. Örneğin; iki "textbox" kontrolü içerisine yazılan sayıları toplayan bir metot yazıldığında, Web arayüzünde textbox kontrolleri içerisine girilen değerler sunucuya gönderilir. Sunucuda toplama işlemi gerçekleştirilir ve sonuç sayfaya geri yazdırılır.

    Viewstate iki türlü kullanılır. İlki ASP.NET tarafından otomatik olarak yönetilmesidir ve kapatılmadığı sürece arkada çalışmaya devam eder. İkincisi ise; kod kısmında koleksiyon olarak kullanılmasıdır.

    Viewstate’in Çalışması 

    ASP.NET arka planda gizli bir input (girdi) kontrolü yaratır ve sayfadaki istenilen kontrollerin bazı özelliklerini (property) base64 koduna çevirerek bu kontrolün içinde saklar. Bu gizlenmiş viewstate kontrolü sayfa ile birlikte yaşar ve sunucu ile istemci arasında birlikte seyahat eder. Dolayısıyla eğer dikkatli ve kontrollü kullanılmazsa, zamanla birikerek ciddi performans sıkıntılarına sebep olabilir. Üstelik aspx sayfası içinde bulunan bir kontrol olduğu için hem post back (geri yükleme) hem de request (istek) süresini uzatabilir.
    Viewstate nesnesinin kullanımı otomatik olduğundan uygulamak için herhangi bir düzenleme gerekmemektedir. Bu nesne okunan değerleri otomatik olarak karıştırır, sıkıştırır ve şifreler. Sayfalar arasında veri taşımadığı için de oldukça güvenlidir. Sonuç olarak viewstate nesnesi, karakter dizileri gibi küçük ölçekli verileri saklamak için uygun bir .NET durum nesnesidir.

    Görüntü Durumu Değerinin Yazılması:

    private void Button1_Click(object sender, System.EventArgs e)
    {
        ViewState["sayi"] = (int)ViewState["sayi"] + 1;
        Label1.Text = ViewState["sayi"].ToString();
    }


    Görüntü Durumu Değerinin Okunması:

    protected void Page_Load(object sender, System.EventArgs e)
    {
        if (ViewState["sayi"] == null)
            ViewState["sayi"] = 0;
    }




    Button1'e (Düğme) her tıklandığında, Viewstate kontrolü kullanılarak Label1 (Etiket) içerisinden okunan "sayi" isimli değer bir artırılarak yeniden Viewstate kontrolü ile Label1'in Text'ine (Metin) yazılır.

  2. Hidden Form Fields (Gizli Form Alanları)

    Bir ASP.NET sayfasının sürekliliğini sağlamak için sayfaya özgü bilgiler bir Hidden Field (Gizli Alan) kontrolü içerisine depolanabilir. İnternet tarayıcısı tarafından sayfa sunucuya gönderildiğinde sunucu; HTTP yapı koleksiyonlarındaki diğer kontrollerin değerlerini kullanarak Hidden Field’in içeriğine erişir. Birçok ASP uygulamasında Hidden Field istemci durumunu sürdürmek için kullanılır; ayrıca bu kontrol var olan uygulamaları ASP’den ASP.NET’e taşımak için kullanılabilir.
    Hidden field’in uygulaması kolaydır ve  tüm web tarayıcıları ile istemci cihazlar tarafından desteklenmektedir. Fakat bu kontrolü kullanmanın bazı önemli dezavantajları vardır. Hidden Field her ne kadar açılan sayfada görünmese de, sayfanın kaynak kodu içerisinde değeri ile birlikte görünür. Bu nedenle; kontrolün içerisine şifre, hesap numarası gibi önemli değişkenlerin girilmesi sakıncalıdır. Hidden Field sunucuya bilgi yollamak için güvenli olmasa da, sayfalar arasındaki geçişlerde çeşitli bilgilerin saklanması için kullanılabilir.
    Ayrıca, Hidden Field içinde basit isim-değer çiftleri depolanabilmesine rağmen, çoklu değerleri Hidden Field içinde saklamak için, yazılım geliştiricinin kendi depolama (storage) ve ayrıştırma (parsing) düzeneğini yaratması gerekmektedir. Örneğin; çoklu değerleri tek alanda depolamak için, karakter dizisi (string)sınırlayıcıları ve bir karakter dizisi ayrıştırma düzeneği uygulanabilir. Viewstate’te de olduğu gibi, Hidden Field içerisindeki büyük değerler, görüntüleme ve geri yükleme sırasında sayfanın yavaşlamasına sebep olur.

    <INPUT style="Z-INDEX: 104; LEFT: 297px; POSITION: absolute; 
    TOP: 322px" type="hidden" id="htmlGizli" value="0" runat="server"> 


    Web formuna bir input (girdi) kontrolü yerleştirildikten sonra, HTML kodu açılıp yukarıdaki gibi düzenlenirse Hidden Field kontrolü bir sunucu (server) kontrolüne dönüşmüş olur.

    private void Button1_Click(object sender, System.EventArgs e)
    {
        htmlGizli.Value = 
           Convert.ToString(Convert.ToInt32(htmlGizli.Value)+1);
        Label1.Text = htmlGizli.Value.ToString();
    }

  3. Cookies (Çerezler)

    Veri saklamanın bir başka yolu olan Çerezler, istemci bilgisayarında saklanan ve dinamik Web sitelerinin bilgilerimizi tekrar tekrar sormamak için bilgilerimizi kaydettiği şifrelenmiş metin (text) dosyalarıdır. Sunucu kaynaklarını tüketmezler ve sayfalar arası veri paylaşımı için kullanılırlar. Bu kontroller, projedeki her sayfa tarafından isimleri  bilinmek suretiyle  kolayca okunabilirler ve uzun dönem bilgi saklamaya elverişlidir. Örneğin; üye girişi yapılması gereken Web sitelerinde "Beni Hatırla" yazılı bir kutucuk işaretlenirse kullanıcı bilgileri bir çereze kaydedilir ve ve .txt uzantılı bir dosya olarak bilgisayardaki Cookies adlı bir dizinde saklanır. Web sitesine tekrar giriş yapıldığında bilgiler oluşan dosyadan okunur ve tekrar giriş yapılmasına gerek kalmaz. Birçok Web tarayıcısı çerezlerin boyutunu 4096 byte olarak sınırlandırmıştır. Çerez, kendisine verilen belli bir yaşam süresine sahip olabilir ve bu süre sonunda kullanılmaz hale getirilebilirler.
    Çerezler, querystring (sorgu dizisi) gibi sadece düşük boyutlu basit karakter dizilerini (string) saklayabilirler. Kolay erisilebilir olmalari güvenlik açısından sorun yaratabilir, bu nedenle gizli bilgileri saklamak için uygun değildir. Ayrıca bilgisayarın sabit diskinde saklandığı için herhangi bir nedenle ortadan kaldırılır veya Web tarayıcısı çerez kullanımına kapatılırsa uygulamada hatalar oluşabilir. Genellikle kullanıcının Web sitesini ziyaretinde hangi konularla ilgilendiği, kaçıncı ziyareti olduğu, kullanıcı adı, e-posta adresi gibi bilgilere erişim amacıyla kullanılır.

    Örnek olarak; bir Dropdownlist ve bir Button kontrolü eklenerek Web form ile oluşturulmuş .aspx sayfasında Çerez kullanımı aşağıdaki gibidir.

    Çerezin değerinin yazılması:

    private void Page_Load(object sender, System.EventArgs e)
    {        
        DropDownList1.Items.Add("pembe");
        DropDownList1.Items.Add("mavi");
        DropDownList1.Items.Add("mor");
    }

    private void Button1_Click(object sender, System.EventArgs e)
    {
        HttpCookie oc = new HttpCookie("renk");
        oc.Values.Add("secilenrenk",DropDownList1.SelectedItem.ToString());
        oc.Expires = DateTime.Now.AddSeconds(10);
        Response.Cookies.Add(oc);
    }

    Çerez değerini okumak için oluşturulmuş ikinci .aspx sayfasında kullanım şekli aşağıdaki gibidir.

    Çerez değerinin okunması:

    private void Page_Load(object sender, System.EventArgs e)
    {
        HttpCookie oc = Request.Cookies["renk"];
        Label1.Text = "Seçtiğiniz renk" + 
                      oc.Values["secilenrenk"].ToString();
    }

    Çerez nesnesinin geçerlilik süresi on saniye olarak ayarlandığı için bu süreyi aşacak şekilde beklenip sayfa tazelenirse çerez nesnesinin oluşturulamadığını anlatan bir hata ile karşılaşılır. 

  4. Query Strings (Sorgu Kelimeleri)

    QueryString sayfa bağlantısı üzerinde bulunan parametrelerin sayfa içerisinde kullanılabilmesine olanak sağlar. Parametreler kullanıcı tarafından görüntülenebildiğinden dolayı güvenlik açısından tehdit oluşturacak parametrelerin bu yöntem ile taşınması önerilmez. Web sitesi üzerindeki herhangi bir sayfada verilen parametrelerle oluşturulan bağlantılar her zaman doğru sayfanın görüntülenmesini sağlar.


    protected void Page_Load(object sender, EventArgs e)
    {
      if (!isPostBack)
      {
         int grupId = Convert.ToInt32(Request.QueryString["grupId"]);
         rpPersonelListesi.DataSource = GetAllPersonelByGrupId(grupId);
         rpPersonelListesi.DataBind();
        }
    }


    Yukarıdaki kod parçası sayfa bağlantısı üzerindeki "grupId" bilgisini "Repeater" kontrolüne veri bağlamada kullanılan metoda parametre olarak göndermektedir. 243 no'lu gruba ait personeller listelenir. 

    Aynı sayfa bağlantısı üzerinde birden fazla parametre gönderilebilmesi için her bir parametre arasına "&" işareti konulmaktadır.



    protected void Page_Load(object sender, EventArgs e)
    {
      if(!isPostBack)
      {
         int grupId = Convert.ToInt32(Request.QueryString["grupId"]);
         string cinsiyet = Request.QueryString["cinsiyet"];
         rpPersonelListesi.DataSource = 
             GetAllPersonelByGrupIdCinsiyet(grupId,cinsiyet);
         rpPersonelListesi.DataBind(); 
        }
    }

    Yukarıdaki kod parçası sayfa bağlantısı üzerindeki "grupId" ve "cinsiyet" bilgilerini "Repeater" kontrolüne veri bağlamada kullanılan metoda parametre olarak göndermektedir. 243 nolu gruba ait bayan personeller listelenir.