2 Ağustos 2013 Cuma

ASP.NET'de PostBack

ASP.NET'de PostBack


ASP.NET'in temel taşlarından birisi olan Post back ( geri gönderim) bizlere (bizler
farkında olmasak bile) asp.net'de kod yazarken kolaylıklar sağlar ve yazdığımız
kod miktarını oldukça kısaltır. Bu makalemizde ASP.NET'i diğer web programlama dillerinden
ayıran en büyük farklardan birisi olan post back mantığını göreceğiz.

Giriş

ASP geliştiricilerinin iyi bildiği gibi, bir web sayfasında form işleme oldukça güçtür. Genelde form sayfası ve formu veritabanına işleyen sayfa olarak bir form için 2 tane sayfa yapılırdı. Hatta bazen bir form için 3 ve daha fazla sayfaya ihtiyaç olduğuda olurdu. Veya tüm işlemleri tek sayfaya yapmak istediğimiz zaman kodumunuzda bir sürü if else deyimi kullanmak zorunda kalıyorduk. ASP.NET'te artık bir form için tek sayfa yapmak yeterli olmaktadır. Bu işlem ASP.NET'te bulunan PostBack mekanizması sayesinde olmaktadır. ASP.NET'te postback sayesinde formlar her zaman aynı sayfaya submit edilir (sunulur), gerekli işlemler ( form kontrolü, formu bilgilerini veritabanına yazmak gibi) olay yakalayıcı metodlar içine yazılır. Ayrıca PostBack sayesinde form alanlarına kullanıcı tarafından girilen değerler her zaman sabit kalır. Yani form kullanıcıya submit'ten sonra geri dönerse form alanlarda kullanıcının daha önce formda girdiği değerler yazar.

PostBack Nedir?

Aspx sayfaları üzerindeki bir butona veya buton tarzı bir kontrole basıldığında (imagebutton, linkbutton gibi) adres satırından gözükeceği gibi devamlı olarak aynı sayfa karşımıza gelir. Bu işleme postback deniyor. Yani postback bir sayfanın sunucuda tekrak değerlendirilmesi için tekrar sunucuya gönderilmesidir. Postback durumundaki bir sayfa ilk açıldıktan sonra en az bir kez sunucuya gönderilmiştir. Bir sayfa ilk açıldığında postback durumunda değildir. Sayfa üzerinde postback yapabilen bir objeye (buton gibi) tıklandığında sayfa postback durumuna geçer.
Postback'ın bazı dezavantajları vardır. Bunlardan birincisi, sayfayı refresh etmek istendiğinde (tazelendiğinde) browserların bir uyarı mesajı çıkarmasıdır. Diğer bir dezavantajı sayfayı favorilere atmada sorunlar yaşanmasıdır. Sayfayı favorilere eklediğimizde devamlı olarak sayfanın ilk hali gelir. (istediğiniz bilgilere ulaşmak için devamlı olarak sayfada aynı işlemleri yapmak gerekir).
Şekil 1: Web sayfasının sunucu tarafından döndürülmesi.
ASP.NET'te sayfa postback yapıldığında, hangi nesneye basıldığı, nesnenin varsa ek özellikleri sunucuya gönderilir. Sunucuda basylan nesneye göre o nesnenin olay yakalayıcı metodlarını (Event Handler) çalıştırılır. Sunucuya bilgi gönderme işi basit bir javascript metoduyla yapılıyor. Bu metodun adı __doPostBack(eventTarget, eventArgument)'dir ve otomatik olarak ASP.NET tarafından sayfaya konulur.

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="BasitSayfa.aspx.cs" Inherits="BasitSayfa" %>
2
3<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
4<html xmlns="http://www.w3.org/1999/xhtml">
5<head runat="server">
6    <title>Untitled Page</title>
7</head>
8<body>
9    <form id="form1" runat="server">
10        <div>
11            <asp:Label ID="Label1" runat="server" Text="basit bir sayfa!!!"></asp:Label>
12            <br />
13            <asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
14            <br />
15            <asp:Button ID="Button1" runat="server" Text="buton !!!" />
16            <br />
17            <asp:LinkButton ID="LinkButton1" runat="server">link butonu</asp:LinkButton>
18            <br />
19        </div>
20    </form>
21</body> 
                                               Kod 1: BasitSayfa.aspx dosyası
şekildeki gibi bir basit bir ASP.NET sayfası yapalım. Bu sayfayı çalıştırdığımızda açylan sayfanın html kodları şekilde görüldüğü gibi olacaktır.

<body>
2    <form name="form1" method="post" action="BasitSayfa.aspx" id="form1">
3<div>
4<input type="hidden" name="__EVENTTARGET" id="__EVENTTARGET" value="" />
5<input type="hidden" name="__EVENTARGUMENT" id="__EVENTARGUMENT" value="" />
6<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="/wEPDwUJLTMwMDkyNjI4ZGTZ7IZZRGLHh5UvKzyW5tMtgm9q8A==" />
7</div>
8<script type="text/javascript">
9<!--
10var theForm = document.forms['form1'];
11if (!theForm) {
12    theForm = document.form1;
13}
14function __doPostBack(eventTarget, eventArgument) {
15    if (!theForm.onsubmit || (theForm.onsubmit() != false)) {
16        theForm.__EVENTTARGET.value = eventTarget;
17        theForm.__EVENTARGUMENT.value = eventArgument;
18        theForm.submit();
19    }
20}
21// -->
22</script>
23        <div>
24            <span id="Label1">basit bir sayfa!!!</span>
25            <br />
26            <input name="TextBox1" type="text" id="TextBox1" />
27            <br />
28            <input type="submit" name="Button1" value="buton !!!" id="Button1" />
29            <br />
30            <a id="LinkButton1" href="javascript:__doPostBack('LinkButton1','')">link butonu</a>
31            <br />
32        </div>    
33<div>
34 <input type="hidden" name="__EVENTVALIDATION" id="__EVENTVALIDATION" value="/wEWBAKjgq2mDALs0bLrBgKM54rGBgLM9PumD8EdOtwzJ8eHg1PZnXzp9WtO0eiA" />
35</div></form>
36</body> 
                                   Kod 2: BasitSayfa.aspx html kodu.
şekilde görüldüğü gibi ASP.NET tarafından oluşturulan sayfada __doPostBack(eventTarget, eventArgument) javascript fonksiyonu otomatik olarak oluşturuldu. Bu fonksiyon sayesinde aspx sayfalarında postback yapılabiliniyor.Bu metod 2 tane parametre alıyor. 1. parametre'de tıklanılan kontrolün id'si, 2. parametrede varsa bu tıklamaya ilişkin ek bilgiler bulunuyor. Bu javascript metodu çalıştığında birinci parametdeki değer __EVENTTARGET adındaki gizli form alanına yazılıyor. 2. parametredeki alan __EVENTARGUMENT gizli alanına yazılıyor. Daha sonra tüm form sunucuya (aynı sayfa üzerine) submit ediliyor. Formda bulunan gizli bu form alanları sayesinde (form submit yapıldığından) ASP.NET hangi kontrolün tıklandığını ve bu kontrole ait ek argumanları bilmektedir ayrıca bu kontrole ait Event Handler metodları var ise (olay yakalayıcı) o metodları çalıştırmaktadır.
Kodda görüldüğü gibi sayfaya eklediğimiz LinkButton sunucu kontrolü'ne tıklandığında __doPostBack('LinkButton1','') metodu çalışıyor. Bu kontrollde ek event argumanı olmadığı için 2. parametre boş bulunuyor. Sunucu kontrolleri bu javascript metodunu render olurken ( html'ye çevrilirken) GetPostBackEventReference metodu çağırarak html kodlarına yazılabilinir. GetPostBackEventReference() metodu IPostBackDataHandler veya IPostBackEventHandler sınıflarının bir metodudur. Yani PostBack yapacak bir sunucu kontrolü bu 2 sınıftan birisini extend yapması gerekmektedir. Ayrıca ileride örneğini yapacağımız gibi bu javascript metodunu sayfanın istediğimiz yerinde çağırabiliriz.

İPUCU:

Kodda görüldüğü gibi Linkbutton kontrolünde _doPostBack('LinkButton1','') metodu vardır fakat buton kontrolünde _doPostBack('LinkButton1','') metodu yoktur. Bunun sebebi butonun türünün submit olmasıdır. Yani bu butona basıldığında sayfadaki form otomatik olarak submit olur. Peki ASP.NET hangi butona basıldığını nasyl biliyor? HTML formları submit edildiğinde form alanlarıyla beraber basylan butonun adıda sunucuya gönderilir. Yani sayfada birden çok buton olsa bile sadece basılan butonun ismi sunucuya gönderileceği için o butonun Event Handler metodları herhangi bir karışıklık yaşanmadan çalıştırılabilinecek.

Javascript ile Kendi Post Back'lerimizi yazmak

Postback işlemleri javascript fonksiyonları ile yapıldığı için biz bu fonksiyonları sayfamızda istediğimiz yere koyarak bu fonksiyonları çalıştırabiliriz. ,Mesela sayfamızda bir link buton var. Bu link butonuna basılmadan önce kullanıcıya bu işlemi yapmak istiyormusunuz diye soracağız. Bunun için sayfamızda gerçek işlemi yapacak bir link button koyuyoruz ve bu link butonun görevini görmesi için yalancı bir link koyacağız. Bu linkin görevi onay penceresi çıkartıp onaylandığı zaman esas linkin tıklanmasını sağlamak olacaktır.

<head runat="server">
2    <style>
3        .gizli{ display:none; }
4    </style>
5    <script language="javascript">
6        function postbackYaptir()
7        {
8            if ( confirm("bu işlemi yapmak istiyormusunuz" ) )
9                __doPostBack('LinkButton1','');
10        }
11    </script>
12</head>
13<body>
14    <form id="form1" runat="server">
15        <asp:Label ID="Label1" runat="server"></asp:Label>
16        <br />
17        <asp:LinkButton ID="LinkButton1" CssClass="gizli" runat="server" CommandArgument="ca" CommandName="cn" OnClick="link_clicked" Visible="False">Test Link Button</asp:LinkButton>
18        <br />
19        <br />
20        <a href="javascript:postbackYaptir()">tıklarsanız</a> uygulamada büyük değişiklikler yapılacaktır.
21    </form>
22</body>
23</html> 
                                Kod 3: javascriptPostBack.aspx dosyası.
Bunu yapmak için öncelikle LinkButtona bir adet Event Handler Metodu ekliyoruz. şekilde görüldüğü gibi link butona tıklamayı yakalayıcı metod olarak link_clicked metodunu ekledik. Daha sonra bu link butonunu sayfada görünmemesi için gizli adında bir sitil sınıfı oluşturduk ve bu sitil sınıfını Link Butona verdik. Bundan sonra bir javascript metodu yazıyoruz. Bu metodun görevi onay penceresi çıkartıp onaylandıktan sonra linkin post back fonksiyonunu çağırmak olacak (yani __doPostBack('LinkButton1','') metodu). Daha sonra yaptığımız bu fonksiyonu bir linke vererek postback'i el ile gerçekleştirmiş bulunuyoruz.
Benzer yöntemle gerekli javascript metodlarını yazarak postback işlemini onclick javascript metodunu destekleyen her alana koyup istediğimiz alana tıklandığında postback işlemi yapabiliriz.

DİKKAT:

ASP.NET tarafından otomatik olarak sayfaya __doPostBack javascript yazılması için sayfada en az bir adet __doPostBack metodunu kullanan bir sunucu kontrolü olması lazım. Eğer örnekte olduğu gibi bir sunucu kontrolünün gözükmesini istemiyorsanız fakat __doPostBack metodunun otomatik olarak oluşturulması isteniyorsa örnekte yaptığımız gibi kullanıcı taraflı bu kontrolün gözükmemesi sağlanmalıdır. Eğer kontrolün gözükmemesi için sunucu kontrolünün Visible değerini false yaparsak, sayfada __doPostBack metodunu kullanan bir kontrol olmayacağı için sayfada otomatik olarak bu metod yazılmayacaktır.
Ayrıca __doPostBack metodunun parametlerini dikkatli girmemiz lazım. Eğer sunucu kontrolü id'sini yanlış girersek istediğimiz olay yakalayıcı metodlar çalışmayacaktır.

Sonuç

Bu makalemizde ASP.NET'in bize sağladığı en büyük kolaylıklardan birisi olan PostBack mantığını gördük. PostBack bir sayfanın sunucuya işlemler yapılması için tekrar geri gönderilmesidir. Sayfa geri döndürüldüğünde sunucu olay yakalayıcı ( event handler) metodlarınu çalıştırıp sayfayı kullanıcıya geri döndürür.
Ayrıca PostBack'in __doPostBack adında bir javascript metodu ile yapıldığını gördük. Bu metodu kullanarak sayfanın istediğimiz yerine basarak sanki bir sunucu kontrolü basılmış gib PostBack yapabiliriz.

Referanslar

  1. MSDN
  2. http://www.codeproject.com/aspnet/ClientObjectPostBack.asp
  3. http://www.eggheadcafe.com/articles/20050609.asp
  4. http://www.xefteri.com/articles/show.cfm?id=18
  5. http://delphi.about.com/library/weekly/aa051705a.htm
  6. http://aspnet.4guysfromrolla.com/articles/111704-1.aspx

Hiç yorum yok:

Yorum Gönder