PostBack Üzerine Notlar

ASP.NET işlerliği içerisinden en çok vuku bulan olaylardan PostBack üzerine notlar, ve birkaç kullanışlı özelliğin el kitabı niyetine anlatımı

Eskiden web programcıları sahip oldukları araçlarla geliştirdikleri uygulamalara otomasyon kazandırmak için çok çaba sarfederlerdi. Gerçi ASP.NET henüz çok yeni ve birçok kişi için çok yabancı olduğu için bu cümlede geçmiş zaman kullanmak doğru olmayabilir. Ama web programcısının önüne gelen yeni araçların eskiden zor yapılabilen şeyleri "işten bile değil" derecesine getirdiği bir gerçek..

Bazen web uygulamalarında, yapılan seçime göre yeni seçeneklerin gösterilmesi gibi şeylerin yapılması gerekir. Seçilen markanın sahip olduğu modellerin listelenmesi gibi mesela.. Ve bunun yapılabilmesi için genelde hazır javascript kodları kullanılır. Dreamweaver gibi programlar sahip oldukları javascript kütüphanesi ile programcıya yardımcı olmaya çalışır. Bir web tasarımcısı böyle birşeyi yapmaya çalıştığında hem zorlanır hem de kendisini tam bir programcı gibi hisseder.

AutoPostBack

İlk iki makalemi genel olarak web kontrolleri konusunda yazdım. Verdiğim iki örnekle kontrollerin nasıl kullanılabileceğini gösterdim. Bu makalemde ise ile olarak yukarıda anlattığım işi, yani kendi kendine tetiklenme (spontaneous triggering) işini müthiş kolay hale getiren bir özellikten bahsedeceğim. Bahsi geçecek olan "AutoPostBack" özelliği bizzat ismiyle insana çok şey anlatıyor zaten. Aslına bakarsanız bu özellikde kontroller ile direk olarak alakalı..

Birçok web kontrolü AutoPostBack özelliğinin değeri programcı tarafından "True" olarak belirlenmişse kendilerine has olayların gerçekleşmesiyle hedefteki Sub ''ı tetikleyebilirler. Biraz karışık bir cümle oldu sanırım. Bazı kontrollerin kendilerine has olayları vardır. AutoPostBack özelliği aktif olan kontrolün olayı gerçekleştiğinde otomatik olarak tetiklenirler. İşte buna AutoPostBack denir. Ancak bu özelliği çok fazla kullanmak, server ''a ek yük getirecektir. Çünkü tüm seçimlerde sayfa yeniden yüklenecektir. Bu nedenle AutoPostBack özelliği sadece gerektiğinde kullanılmalıdır. İsterseniz küçük bir örnekle AutoPostBack ''in çalışmasını göstereyim.

  AutoPostBack özelliğine bir bakış..
<%@ Page Language="VB" Debug="True"%>
<title> AutoPostBack örneği..</title>
<script runat="server" language="vb">

  Sub SecimYap(Sender As Object, E As EventArgs)
  Dim sayi As Integer = lstSayilar.SelectedItem.Text
  lblSonuc.Text = sayi & " sayısının karesi " & Math.Pow(sayi,2)
  lstSayilar.SelectedIndex = -1
  End Sub

</script>

<form runat="server">
<asp:ListBox id="lstSayilar" runat="server"
  AutoPostBack="True" OnSelectedIndexChanged="SecimYap"
  style="font: 11px verdana;"
  
>

<asp:ListItem>13</asp:ListItem>
<asp:ListItem>21</asp:ListItem>
<asp:ListItem>46</asp:ListItem>
<asp:ListItem>55</asp:ListItem>
</asp:ListBox><br><br>
<asp:Label id="lblSonuc" runat="server"
  style="font: 11px verdana;"
  
/>

</form>

Örnek olarak verdiğim kodda da gördüğünüz gibi ListBox kontrolünün olayı olan OnSelectedIndexChanged gerçekleştiğinde hedef olarak belirlenmiş ve yazılmış SecimYap sub ''ı tetikleniyor. Bu olay Türkçe manasıyla "Seçili index değiştiğinde" oluyor. Kontrol otomatik olarak bir Post Back yapması konusunda direktif aldığından dolayı olayın gerçekleşmesiyle birlikte görevini yerine getiriyor.

AutoPostBack örneğine ait ekran görüntüsü..


İlk makalemde verdiğim dinamik listeler isimli örneği hatırlamanızı istiyorum. O örnekte iki adet ListBox ve iki adet de Button kontrolü kullanmıştık. Seçili elemanı PostBack sonunda diğer listeye atıp zaten içinde olduğu listeden çıkartıyorduk. Ancak konumuzla alakası; bu işi yapmak için kullanıcı önce seçim yapıyor, sonra gerekli butonu tıklıyordu. Butonun OnClick olayında ise gerekli işlemler gerçekleştiriliyordu.

Bu örneği AutoPostBack özelliğini kullanarak geliştirmeye çalışabilirsiniz. Bir ListBox için nasıl AutoPostBack yapabileceğinizi yukarıda verdiğim kod ile gösterdim. Artık iki değil bir adet bile Button kontrolü kullanmamıza gerek yok. Yapmanız gereken; iki ListBox kontrolünün de AutoPostBack özelliğinin değerini "True" yapmak ve butonların hedefleri olan sub ''ları ListBox kontrollerinin OnSelectedIndexChanged olaylarının hedefi yapmak olacaktır.

Böylece kullanıcı herhangi bir listeden seçim yaptığında PostBack oluşacak ve seçili eleman diğer listeye atılacaktır. Dinamik listeler örneğinde, herhangi bir listeden seçim yapılmadan butonlardan birine tıklanırsa veya seçim yapıldığı halde yanlış butona tıklanırsa bir hata mesajı ile karşılaşılıyordu. Bunun nedeni diğer listeye atmak için bir değişkene atanacak olan seçili eleman değerinin boş olmasıydı. Seçim yapılmadığı için veya yanlış butona basıldığında yanlış listeden seçili eleman arandığı için değer bulunamıyordu. Gerek görmediğim için koda bunu engelleyecek bir kontrol deyimi koymamıştım. (Kodu ve örneğin çalışan halini değiştirdim) AutoPostBack özelliği kullanılarak yeniden yazılacak dinamik listeler örneğinde ise seçim yapılması zorunlu hale geleceği için bu hatayla karşılaşılma ihtimali yoktur ve "if" kontrolü koymaya gerek kalmaz.

EnableViewState

ASP.NET, HTTP ''nin stateless (durumsuz) olmasının getirdiği büyük handikapı aşmak için değişik mekanizmalar kullanır. Bu şekilde kullanıcıya aynı sayfayı kullandığı hissini verir. Kullanıcı kendisini bir masaüstü programın kolllarında hisseder. Kullanıcı butona tıklar, OnClick olayı server''da çalışır ve yanıt client''e gönderilir. Gerekli bilgiler HTML kodu içerisinde tutulur. Böylece kontrollerin PostBack öncesi değerleri PostBack sonrasına taşınırlar.

Arka planda tonlarca veri taşınmakta ve devam etmekte olan session (ziyaret sezonundan bahsediyorum) ''un selameti için kullanıcıya çaktırmadan client-server arası iletişim devam ettirilmektedir. Böylece client ile server arasındaki "al gülüm, ver gülüm" ilişkisi "al gülüm, vermeni bekliyom gülüm" ilişkisine döner. İki taraf arasındaki bağlantı her ne kadar yine kesiliyor olsa da taraflar birbirlerine karşı vefalıdır ve bir dahaki görüşlerinde selamlaşırlar.

EnableViewState özelliği ise kontrollerde veya direkt olarak @Page direktifi içerisinde kullanılabilir. @Page direktifi içinde kullanıldığında sayfa içerisindeki kontrollerin EnableViewState özelliklerinin değerinin bağlayıcılığı kalmaz ve direktifte ne dendiyse o olur. EnableViewState özelliğinin değeri "False" olarak belirlenmiş bir TextBox kontrolünün değeri PostBack sonrasında korunmaz. Ancak bu "korunmama" işlemi, listedeki seçili elemanın PostBack ''den sonra da seçili olmamasını sağlayamaz. Bilmiyorum tahmin edebildinizmi ama EnableViewState özelliğinin değeri "True" olan bir ListBox ''un elemanlarını page_load içerisinde doldurur ve buna bir "if not IsPostBack" kontrolü koyarsanız, PostBack sonunda liste boşalır. Normalde aynı "if" deyimi nedeniyle tekrar yüklenmemesini sağladığımız elemanlar zaten korunmuş olacaktı.

  ASP.NET motorunun client tarayıcıya gönderdiği HTML koduna eklediği VIEW STATE etiketi..
<input type="hidden" name="__VIEWSTATE" value="dDwtNTE4Nzg5ODcwO3Q8O2w8aTwxPjs+O2w8dDw7bDxpPDE+Oz47bDx0PHQ8O3A8bDxpPDA+O2
k8MT47aTwyPjtpPDM+O2k8ND47aTw1Pjs+O2w8cDxpc3RhbmJ1bDtpc3RhbmJ1bD47cDxrb2NhZWxpO2t
vY2FlbGk+O3A8YW5rYXJhO2Fua2FyYT47cDxrb255YTtrb255YT47cDxidXJzYTtidXJzYT47cDx0cmFi
em9uO3RyYWJ6b24+Oz4+Oz47Oz47Pj47Pj47PtltnU/veMAZkdOEW5h1dao1QoH4" />

Çalıştırılan .aspx dosyaları işlendikten sonra client tarayıcıya gönderildiğinde yorumlanan kaynak koda bakılırsa ismi "__VIEWSTATE" olan "hidden" bir INPUT etiketi dikkati çekecektir. Sayfadaki kontrol sayısına doğru orantılı olarak bu etiketin değeri uzar.

EnableViewState özelliğini nerelerde kullanabiliriz ? Aslına bakarsanız ben de henüz uygulama geliştirme aşamasına geçmediğim için aklıma pek kullanım alanı gelmedi. Ancak size bu özelliğin nasıl kullanıldığı ve nasıl işlediği hakkında bir fikir verebilmek için basit bir örnek bulmam gerekiyordu. Gerçekten de çok basit birşey buldum ve kısa bir kod verip konuyu daha fazla uzatmayacağım.

  EnableViewState örneği..
<%@ Page Language="VB" Debug="True" %>

<script runat="server">
Sub page_load(Source As Object, E As EventArgs)
  If Not IsPostBack Then
    lblMesaj1.Text = "Bu metin butona tıklandıktan sonra bir daha görünmeyecek..."
    lblMesaj2.Text = "Bu metin ise tarayıcının sonuna kadar baki kalacak.."
  End If
End Sub
</script>

<form runat="server">
*  
<asp:Label id="lblMesaj1" runat="server"
  style="font: bold 15px Arial;" EnableViewState="False"
  
/>

<br><br>
*  
<asp:Label id="lblMesaj2" runat="server"
  style="font: bold 15px Arial;" EnableViewState="True"
  
/>

<br><br>
<asp:Button id="btnGonder" runat="server" Text="Yazıyı yoket"/>
</form>

Bu kodda göreceğiniz iki label kontrolünün değeri az önce de bahsettiğim gibi page_load olayı içerisinde ve IsPostBack kontrolünde belirleniyor. btnGonder isimli butonun tek görevi bir PostBack oluşturmak olduğu için OnClick olayına hedef belirtilmiyor. Bu buton tıklandığında EnableViewState değeri "False" olan lblMesaj1 ''in değeri boşalırken lblMesaj2 ''nin değeri korunuyor. Bu arada @Page direktifinde bu konuda hiçbir belirtme yapılmadığına dikkatinizi çekerim.

EnableViewState örneğine ait ekran görüntüsü..


Peki, sizce @Page direktifine EnableViewState="False" deyimini eklesek nasıl bir tepki alırız ? Tahmin edebileceğiniz gibi label kontrollerinin ikisi de artık değerlerini korumayacaktır. lblMesaj2 ''nin içerisinde "değerini koru" dediğimiz halde.. Aynı durum tersinde de çalışacaktır. Ancak kontrolün değerini IsPostBack kontrolü ile belirlemezseniz istediğiniz kadar yere EnableViewState="False" yazın değeri yok edemezsiniz. Sanırım bu konu için bu kadarı yeter...

AutoEventWireUp

Makalenin üçüncü konusu olan "AutoEventWireUp" kelimesinin anlamı için "Otomatik bağla" diyebiliriz. Neyi bağlıyoruz ? Cevap: "Page" ''e ait olayları.. "Page" ''e ait en çok kullandığımız olay "page_load"..

AutoEventWireUp, @Page direktifinin bir niteliğidir. True ve False şeklinde iki değeri vardır. Varsayılan değeri True ''dur. Değerinin True olması durumunda, sayfanın çalıştırılması sırasında Page ''e ait olaylar otomatik olarak tetiklenirler. Yani bağlanırlar.. Bu olaylara ait sub ''ları çağırmaya gerek yoktur. AutoEventWireUp="False" deyimini @Page direktifine yazdığınızda ise bu iki olay işleme konmaz. Ben kod vermeyeceğim ama nasıl deneme yapabileceğinizi söylemek istiyorum.

Script bloğu içerisinde bir page_load sub ''ı oluşturun. Sayfa içerisinde oluşturduğunuz bir label kontrolüne page_load içerisinde değer atayın. Bu kodu önce AutoEventWireUp="True" şeklinde çalıştırın. Label kontrolüne değer atandığını göreceksiniz. Şimdi de AutoEventWireUp="False" yapın ve label kontrolünün değersiz olduğunu görün. Bu özelliğin iki değeri için @Page direktifi ve page_load sub ''ı şu şekilde olacaktır.

<%@ Page Language="VB" Debug="True" AutoEventWireUp="False" %>

<script runat="server">
Public Sub Page_Load(Source As Object, E As EventArgs) Handles MyBase.Load()
'' ....
End Sub
</script>

<%@ Page Language="VB" Debug="True" AutoEventWireUp="True" %>

<script runat="server">
Public Sub Page_Load(Source As Object, E As EventArgs)
'' ......
End Sub
</script>

Netice

Üçüncü makalemi yazdım ve üçünde de temel olarak web kontrollerinin, olayların nasıl kullanılacağını göstermek istedim. Verdiğim örneklerin basit olmasına, kafa karıştırmamasına ve anlatmak istediğimi tam olarak anlatmasına dikkat ettim. Her ne kadar bu örneklerde kullandığım ve böylece tanıştırdığım web kontrolleri bir elin parmaklarını geçmiyor olsa da en azından ampulu yakabildiğimi düşünüyorum. Eminim birçok kişi veritabanı kullanma ile ilgili makalelerin yazılmasını ve yayınlanmasını bekliyor. Ancak ben temel bilgileri vermeden direkt olarak veritabanı gibi daha ayrıntı ve gelişmiş bir konuya girmenin yanlış olacağını düşündüm hep.

Ama şimdi bakıyorum ki web kontrollerinin kullanımı veya kullanışlı özellikleri üzerine daha fazla makale yazmama gerek yok. Sanırım birçoğunuz artık veritabanı konusuna vakıf olacak kadar ASP.NET bilgisi edinmişsinizdir. Bu ne demek oluyor ? En yakın zamanda veritabanı kullanımı ile ilgili makaleler gelecek. Ama bundan sonra yazacağım makalelerde de web kontrolleri hakkında bilgi vereceğim ve satır aralarında onlara değineceğim. Zaten web kontrolleri direkt olarak tasarımı etkilediği için konumuzun ayrılmaz parçası olarak baki kalacak. Gelecek makalelerde tekrar okuşmak üzere...

Sevgi, saygı, ASP.NET...

, , ,

Arşivden

“PostBack Üzerine Notlar” için tek yorum var:

  1. Serdar Tibet: []
    Çok güzel bir makale hazırlamıışsın meslektaşım. Tebrik ediyorum. Bu vesile ile iyi seneler dilerim.

Yorum yazabilirsiniz


* [b], [i] ve [quote] serbest