Makale Özeti

ICallBackEventHandler arayüzü ve ASP.NET 2.0 uygulamalarında sayfa postback olmadan sunucu tabanlı metodların çağrılması üzerinde duruyor olacaz.

Makale

Web tabanlı uygulamalar için en büyük  sıkıntılardan biri Windows tabanlı uygulamalarda olduğu gibi bize zengin bir içerik sunamıyor olmasıydı .Sayfaların sunucu taraflı bir metodu çağırmak için sürekli kendini tazelemek zorunda olması ,hem performans açısında sıkıntı yaratabiliyor  hem de  kullanıcıları bu bekleme süresinde hoşnutsuz bırakabiliyordu. Son zamanlarda adını sıkça duyduğumuz AJAX teknolojisi bu soruna bir çözüm olarak ortaya çıktı  . Artık bu teknolojiyi temsil eden framework’ler geliştiriciler tarafından uygulamalarda sıkça  kullanılmaktadır .

Bu frameworklere alternatif olarak makalemizde .NET 2.0 içinde yer alan ICallBackEventHandler arayüzünü inceleyecez  . ICallBackEventHandler bize uygulamalarımızda kolayca asenkron çağrılar yapabileceğimiz bir imkan sunmaktadır . ICallBackEventHandler  arayüzü System.Web.UI  namespace’i içerinde yer alıyor . Tanımı :

 

public interface ICallbackEventHandler

{

                string  GetCallbackResult(string eventArgument);

                void RaiseCallbackEvent();

}

 

 

GetCallbackResult : Callback olayının sonucunu döndüren metoddur.

RaiseCallbackEvent : Callback sırasında işlem gören metoddur .

 

Burada sırasıyla önce RaiseCallbackEvent metodu çalışır ve sonrasında bize sonucu döndüren GetCallbackResult metodu çalışır . Çalışma sırasında RaiseCallbackEvent metodu içerisinde oluşan bir hata GetCallbackResult metodunun çalışması engellemeyecektir(sunucu tarafında bir hata olmasa da ,sonucun döndüğü javascript çalışmayacaktır gene de) . Böyle bir durumda hatanın kullanıcı tarafında da handle edilebilmesi için hatayı belli eden standart bir geri dönüş ifadesi belirleyebiliriz (Mesela -1 gibi).

Diğer dikkat etmemiz gereken bir husus ise GetCallbackResult metodunun eventAgument parametresine null bir değer gönderdiğimiz vakit  bunun string bir ifade olan “null” olarak serialize edilmesidir . Bu yüzden özellikle parametre olarak null göndermekten kaçınmalıyız veya sunucu metodunda bir şekilde handle etmeliyiz.

Örnek uygulamamızda TC Kimlik No yazıldıktan sonra  sonuçlar asenkron bir şekilde ,sayfa tazelenmeden ekrandaki Textbox’lara yazılacaktır .Yapacağımız ilk iş sayfamızı bu arayüzden türetmek olacaktır.

 

public partial class Test : System.Web.UI.Page,ICallbackEventHandler

 

            Visual Studio biz bu türetmeyi yaptıktan sonra bize bu arayüze ait metodları otomatik olarak yaratacaktır(Cursor arayüz adı üzerindeyken Ctrl+Shift+F10 tuşlarına basıp menüden gerekli komutu çağırmamız gerek)

 

    #region ICallbackEventHandler Members

 

    public string GetCallbackResult()

    {

        throw new Exception("The method or operation is not implemented.");

    }

 

    public void RaiseCallbackEvent(string eventArgument)

    {

        throw new Exception("The method or operation is not implemented.");

    }

 

    #endregion

 

    RaiseCallback metodu yukarıda deklare edildiği gibi parametre alabilmektedir . Bu parametreyi TC Kimlik No’yu yollamak için kullanıcaz . Bundan sonra ortaya çıkan kodlar şu şekilde olacaktır :

 

    string donenDegerler = string.Empty;

 

    public string GetCallbackResult()

    {

        return donenDegerler;

    }

 

 

    public void RaiseCallbackEvent(string eventArgument)

    {

KimlikServisi.KPSPublicWebService servis = new Kimlik       Servisi.KPSPublicWebService();

        KimlikServisi.TCKimlikNoDogrulamaSonucu sonuc = null;

 

        try

        {

            sonuc  = servis.TCKimlikNoDogrula(Convert.ToInt64(eventArgument));

            donenDegerler = sonuc.Ad + "&" + sonuc.Soyad + "&" + sonuc.DogumYil;

        }

        catch (Exception ex)

        {

            donenDegerler = "HATA";

            return;

        }

    }

 

Not:KPSPublicWebService için adres  : http://tckimlik.nvi.gov.tr/kpspublic.asmx

 

Buradaki sıkıntı dönüş değeri birden fazla birim içerdiğinde bunları bir şekilde kullanıcı tarafında ayırabiliyor olmalıyız . Burda kişisel tercihim dönüş değerleri arasına “&” işaretini koymaktı . Dönen değerler şu şekilde gözükecektir  :

 

Kutlu&Araslı&1983

 

            Sunucu tarafında  yapılması gereken iş burada bitmiyor . Birde bunları kullanıcı tarafından çağıracak javascript kodlarının yaratılmasını sağlamalıyız . Aşağıdaki şablon çoğu zaman işimizi görecektir .

 

        protected void Page_Load(object sender, EventArgs e)

    {

        ClientScriptManager cm = Page.ClientScript;

        String cbReference = cm.GetCallbackEventReference(this, "arg",

            "SonucuAl", "");

        String callbackScript = "function KontrolEt(arg,context) {" +

            cbReference + "; }";

        cm.RegisterClientScriptBlock(this.GetType(),

            "KontrolEt", callbackScript, true);

    }

 

 

    Yukarıda “KontrolEt” adında bir javascript metodu tanımlanmış ve bu metod içinde “SonucuAl” adında diğer bir metod referans edilmiştir. “KontrolEt” metodu sunucu çağrısını yaptıktan sonra  , “SonucuAl” adında bir parametre alan diğer bir metod GetCallbackResult metodunun geri dönüşünden sonra kullanıcı tarafında kendiliğinden çalışacaktır ,bu metod geliştiriciler tarafından tanımlanmalıdır. Bundan sonrası tamamen sizin javascript kodlarınıza emanettir .

 

 

<script type="text/javascript">

       

        var beklemeEkrani;

   

        function Getir()

        {

            beklemeEkrani = window.open('','','width=200,height=50');

            beklemeEkrani.document.writeln('<marquee align="center" behavior="scroll" direction ="right" width="100%" >Lütfen bekleyin</marquee>');

       

            var kimlikNo = document.form1.txtKimlikNo.value;

            KontrolEt(kimlikNo,'');

        }

        function SonucuAl(donenSonuc)

        {

           var degerlendirme = SonucuDegerlendir(donenSonuc);

          

           if(degerlendirme)

           {

              var sonuclar = donenSonuc.split('&');

              

              document.form1.txtAd.value            = sonuclar[0];

              document.form1.txtSoyad.value         = sonuclar[1];

              document.form1.txtDogumTarihi.value   = sonuclar[2];

           }

          

           beklemeEkrani.close();

        }

       

        function SonucuDegerlendir(donenDeger)

        {

            if(donenDeger == 'HATA')

            {

                alert('Web servisine erişim sırasında hata\r\noluştu veya kayıt bulunamadı');

                return false;

            }

            else

            {

                return true;

            }

        }     

 

            İşin aslına bakıldığında çok da az kod yazdığımız söylenemez  ama çok da zor bir iş yapmış sayılmayız  . Gerisi sizin hayal gücünüze kalmış artık . Sayfanın tamamı ekte yer alıyor , isterseniz bir bütün halinde de kodları indirip inceleyebilirsiniz .

 

İletişim için : kutlu.arasli@netron.com.tr

 

Referans :

http://msdn2.microsoft.com/en-us/library/ms178208.aspx

Kodlar