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. |
<%@ 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ı |
<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. |
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ı. |
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
- MSDN
- http://www.codeproject.com/aspnet/ClientObjectPostBack.asp
- http://www.eggheadcafe.com/articles/20050609.asp
- http://www.xefteri.com/articles/show.cfm?id=18
- http://delphi.about.com/library/weekly/aa051705a.htm
- http://aspnet.4guysfromrolla.com/articles/111704-1.aspx
Hiç yorum yok:
Yorum Gönder