ASP.NET VE WEBFORMS’A GİRİŞ
Asp ile çalışan, ve belli bir seviyeye gelmiş bir programcı olduğunuzu düşünelim. Asp ile sunucu taraflı yazılım geliştiren pek çok geliştirici aynı şeyleri tekrar tekrar yapmak zorunda kalır. Diğer geliştirme ortamlarına göre ASP’nin bazı yönleri gerçekten verimsizdir. İlk olarak ASP size tutarlı ve güçlü bir programlama modeli sunmaz. Her ne kadar ActiveX , COM gibi teknolojiler size sadece ASP ile yapamadığınız şeyleri yapma imkanı sağlasa da, genel olarak ASP diğer geliştirme ortamları ile karşılaştırıldığında işinizi kolaylaştıran ve verimli çalışmanızı sağlayan bir yazılım geliştirme ortamı sayılmaz. İşimizi nasıl kolaylaştıracak derseniz, örnek olarak olarak Visual Basic kolayca kullanılan, ve oldukça güçlü bir programlama modeli olan “event driven code” yazma olanağını sağlar. Daha önce Visual Basic ile tanışmamış olanlar için kısaca açıklarsak; VB ile bir form tasarlar, bir kaç tıklama ile butonları, metin alanlarını, onay kutucuklarını bu forma yerleştirir, ve sonra bu elemanlara denk gelen olaylar için kod yazarsınız. Mesela bir butona tıklanınca otomatik olarak bu olay için sizin önceden yazdığınız kod çağrılır. Yani tasarladığınız form, kullanıcılar tarafından kullanıldıkça meydana gelen tüm olaylar için ( mouse’un sağ tuşuna basılması, klavyeden bir tuşa basılması, programın kapatılması…) önceden sizin belirleyeceğiniz işlemler gerçekleştirilir. VB pencerelerin açılması, mouse hareketlerinin izlenmesi gibi işletim sistemi ile alt seviyede haşır neşir olmanızı gerektiren ve her programınızda mutlaka kullanacağınız işlemleri otomatik olarak halleder.
ASP ile yazılım geliştirirken bu tür bir programlama modelinin eksikliği sizi bir hayli zorlar. Her zaman yapmak zorunda olduğunuz işleri bir düşünelim. Temel bir örnek olarak, bir web sayfası için bilgi girişi amacıyla bir form hazırladığımızı varsayalım. Hemen her ASP programcısının bir web uygulamasında bir form tasarlaması, bu forma girilen bazı bilgileri kontrol etmesi, ve formdaki bilgileri mail ile göndermesi gerekmiştir.
Peki, kullanıcılar forma eksik bilgi girdiğinde ne olacak ? Programcı olarak bunu yakalamak da sizin görevinizdir.Oturup her zorunlu bilgi için kontrol kodunu yazmanız gerekir . Her zorunlu alan, sizin için yeni bir angarya demektir. Oturup homurdana homurdana kullanıcıların belli alanları (mesela telefon numarasını )boş bırakmadan formu gönderememesi için gerekli kodu yazarsınız.
Üstelik bu standart işleri yapmanın standart bir yolu da yoktur! Form örneğimizi düşünürsek, form bilgilerini adım adım sayfadan sayfaya taşımak sizin işinizdir. Session seviyesinde değişkenler kullanabilirsiniz, ya da formun içinde tanımlayacağınız hidden alanlar veya veritabanı yardımıyla bilgileri taşıyabilirsiniz . Bu gibi detaylarla her seferinde uğraşmak verimlilik açısından büyük bir kayıptır. Yazdığınız kodun hata oranı yüksektir, ve sizden başka programcılar kodunuz üzerinde çalıştığında, sizin zekice çözümleriniz kodunuzu anlamaya çalışan o zavallıların sinir krizi geçirmesine neden olabilir .
Çok mu iç karartıcı oldu ? Belki, ama iyi haberlerim olmasa bu kadar karamsar yorumlar yapmazdım :) ASP.NET’in size sunduğu programlama modelleri ile yukarıda saydığım, ve sayacak yerimizin olmadığı bir sürü sorun artık tarih oluyor .
Bir dakika , programlama modelleri mi dedim ?? Evet, ASP.NET teknik altyapısındaki devrimsel değişiklerin yanı sıra, birden fazla programlama modelini de emrinize vererek güçlü web ve intranet uygulamalarını kolayca oluşturmanızı sağlıyor. Bu programlama modellerini teker teker veya birlikte kullanmakta özgürsünüz. “Web Forms”, ve “Web services” olarak adlandırılan bu modellerden Web Forms ‘a bu yazıda kısaca bir giriş yapmaya çalışacağız. Web Services .NET ile gelen bir başka yenilik ve ASP.NET dışında da heyecan verici olanaklar vaat ediyor. Bir başka yazıda da o konuya göz atarız umarım:)
Şimdi kısaca Web Forms’u tanımlayalım:
ASP:NET WEB FORMS NEDİR ??
Web Forms, ASP.NET ile yazılım geliştiren programcılara Microsoft tarafından sağlanan bir programlama modelidir. Web Forms sizi sunucu taraflı yazılım geliştirmenin klasik sorunlarından kurtarmak için tasarlanmış. Peki bize ne sağlıyor? Maddeler halinde özetleyelim :
Peki Web Forms kullanan sayfalar neye benziyor ? İlk söylenebilecek olan: uzantıları .ASPX ( asp.net sayfaları artık .asp yerine .aspx uzantısını kullanıyor). Mesela deneme.aspx isminde bir asp.net sayfanız var diyelim. Herhangi bir kullanıcı sunucudan http://sunucu/deneme.aspx şeklinde bu sayfayı isterse, ilk kullanımında ASP.NET motoru, sayfayı işliyor ve bir .NET Framework class haline getiriyor. Daha sonraki istemciler de bu ilk kullanımda ortaya çıkan class’ı kullanıyor. Yani .aspx sayfası sadece ilk kullanımda derleniyor. Dikkat ettiyseniz “derleniyor “ diyoruz, artık asp’deki interpreted sayfalar yerine asp.net, derlenmiş sayfaları kullanıyor, ve bu da başta performans olmak üzere bir çok avantaj sağlıyor.
Peki .aspx sayfalarını nasıl hazırlıyoruz. ASP ye göre kolaylık açısından bir kaybınız yok, herhangi bir metin editörü ile aspx sayfalarınızı yazabilirsiniz.
Bir html sayfasının uzantısını değiştirip .aspx yapsanız, elinizdeki dosya yine sorunsuz olarak çalışacaktır.
Mevcut ASP sayfalarınız da ASP.NET ile syntax olarak uyumludur. Tanıdık dostlarımız olan <% %> tagleri hala emrimizde, ancak onları eskisi kadar kullanmayacağız. ( Nedenine geliyoruz)
Asp.NET sunucu kontrolleri: (ASP.NET SERVER CONTROLS)
Asp.NET ile gelen sunucu kontrolleri (umarım bu şekilde bir çeviri uygundur) bize gerçekten büyük kolaylıklar sağlıyor. Bu kolaylıkları görmeden önce bu kontrolleri nasıl tanımlayacağımıza bakalım:
Sunucu taraflı kontroller için kontrol’ün tag’ında runat=”server” ifadesini kullanıyoruz. Alıştığınız standart html kontrolleri veya kendi tanımlayacağımız kontroller için de runat=”server” ifadesi (eğer kullanılabiliyorsa ) çok seveceğiniz bazı kolaylıklar sağlıyor. Biraz daha somut bir şekilde anlatmaya çalışayım:
Demin bahsettiğimiz form örneğinde eğer form’da eksik bir alan varsa, kullanıcıları tekrar form sayfasına göndermeniz gerekir. Bunu yapmak için iki yöntem kullanabilirsiniz; ya kullanıcıya tarayıcısının geri tuşunu kullanmasını söylersiniz, ya da, siz response.redirect() metoduyla o sayfaya geri dönüşü sağlarsınız. Tabii bu redirect işlemi yüzünden form sayfanız tekrar baştan yüklenecek, ve kullanıcının bir tane hatalı veya eksik girdiği alan bile olsa diğer tüm girdiği bilgiler uçacaktır.
Web programcısı tabii ki böyle bir duruma izin veremez, bu nedenle bu ileri geri gidişler sırasında hidden form alanları veya session değişkenleri gibi yöntemlerle bilgileri kaybetmeden, web uygulamanızın kullanım kolaylığını sağlamaya çalışırsınız. Nedendir bilinmez, kullanıcılar da sizinle inatlaşmayı pek bir sevdikleri için sizin iki üç aşamalı form sayfalarınızda oradan oraya seker dururlar. Sonuçta siz aman formdaki bilgiler kaybolmasın diye destan gibi kod yazarsınız, ama yine de formda bir açık olma olasılığı vardır. ( Mesela benim yazdığım bir sipariş modülü bir dönem alıcı adı olmayan isimsiz siparişler üretiyordu !!! . ) Bütün bu anlattığım sorunlar formlarda kullandığımız metin kutuları, drop-down list’ler gibi elamanların state management desteği olmamasından kaynaklanıyor. Yani sunucu taraflı bir mekanizma ile otomatik olarak belli değerleri saklayamıyoruz. Ancak ASP.NET ile bu sorun ortadan kalkıyor, ve runat=”server” ifadesi kullanılan bazı tagler, eğer mümkünse ( bir çok kontrol olduğu için biraz dikkatli yazmak gerekiyor, o sebeple mümkünse diyorum ) state management olanağına kavuşuyorlar.
İyi hoş ama bu ne anlama geliyor şimdi diyorsanız haklısınız, hemen somut bir örneğe geçelim:
Diyelim ki, bir form yazdık, ve bu formu değerlendirmek için tekrar kendisine yolluyoruz.
(Web programcılarının oldukça sık kullandığı bir tekniktir.)
Yani deneme.aspx şeklinde bir sayfamız var, ve içeriği de aşağıdaki gibi:
<HTML>
<HEAD>
<title>Asp Web Forms deneme sayfası</title>
</HEAD>
<body>
<form method="post" action="deneme.aspx" >
<input type="text"> <input type="submit" value="Yolla">
</form>
</body>
</HTML>
Bu sayfayı çalıştırdığımızda sadece bir metin kutusu ve bir “yolla” düğmesi görürüz. Metin alanına herhangi bir şey girip düğmeye basan kullanıcı yine boş bir form sayfasına çıkacaktır.
Peki şimdi kodumuzda ufak bir değişiklik yapalım:
<form method="post" action="deneme.aspx" runat="server" >
<input type="text" runat="server" >
<input type="submit" value="Yolla">
Şimdi formumuza ve form içindeki metin alanına runat="server" ifadesini ekledik. Şimdi sayfayı çalıştıralım ve metin kutusuna herhangi bir şey girip yollayalım .
Artık metin kutusuna girdiğimiz yazı aynen korunuyor ! Metin kutusuna “deneme” yazdıktan sonra yolla butonuna basın, daha sonra sayfanın kaynak koduna bakarsanız aşağıdaki kodu göreceksiniz:
<form name="ctrl0" method="post" action="deneme.aspx" id="ctrl0">
<input type="hidden" name="__VIEWSTATE" value="dDwxNzU2ODcxNTcyOzs+" />
<input name="ctrl1" type="text" value="deneme" /> <input type="submit" value="Yolla">
Buradaki en önemli değişiklik, forma eklenen hidden alan. Bu alanı ASP.NET framework bizler için oluşturuyor. Burada verilen value değeri ile formunuzda sizin istediğiniz alanlar için bilgilerin “round trip” sırasında, yani form aynı sayfaya her postalandığında saklanmasını sağlıyor. Daha önce ASP ile bizim elle yaptığımız state management artık otomatik olarak gerçekleştiriliyor. Yani formunuzdaki alanları siz takip etmek zorunda değilsiniz. Bu da bizi satırlarca kod yazmaktan ve hata olasılığından kurtarıyor.
ASP.NET framework bizlere web uygulamalarımızda kullanmamız için bir çok server control sağlıyor. Bunlara ait birkaç örnek için yukarıdaki formumuzu biraz değiştirelim.
<html>
<head>
<title>web forms örnek sayfası -2-</title>
</head>
<center>
<form action="deneme2.aspx" method="post" runat=server>
<h3> İsim: <asp:textbox id="Name" runat="server"/>
Departman: <asp:dropdownlist id="Departman" runat=server>
<asp:listitem >Muhasebe</asp:listitem>
<asp:listitem >Pazarlama</asp:listitem>
<asp:listitem >Reklam</asp:listitem>
</asp:dropdownlist>
</h3>
<asp:button text="Ara" runat="server"/>
</center>
</html>
Yukarıdaki örnek deneme2.aspx sayfasının içeriği. Bu sayfayı çalıştırdığımızda karşımıza yine bir form geliyor. Çok basit bir örnek olduğu için fazla bir işlevselliği yok, ama ufak bir iki müdahale ile bir şirket için çalışanlara ait bilgileri görebildiğimiz bir program haline gelebilir.
Bir önceki örneğimize göre farklara bir göz atalım. İlk olarak bu örnekte yeni bir öğe var: yine server side bir kontrol tanımlıyoruz. Bu sefer bir dropdown list. Ayrıca ilk örnekte bildiğimiz bir html tag’ine runat=”server” ifadesini ekleyerek ASP.NET ile gelen state management olanağından faydalandık. (<input type="text" runat="server" > ) Ancak bu örnekte ASP.NET’in sunucu taraflı kontroller için kullandığı yazımı kullanarak bir “textbox” tanımladık, ve webforms ile çalışırken kodunuzun tutarlılığı açısından mümkün olduğunca bu yazılışı kullanmanızı tavsiye ederim. Textbox kavramı Windows üzerinde IDE kullanarak program yazan herkese oldukça tanıdık gelecektir. Bence bu isimlendirme bile MS’in web forms ile ASP.NET’i Visual Basic gibi bir geliştirme ortamı haline getirmeye çalıştırdığının bir kanıtı.
Bir parça da WebForms ile kullandığımız sunucu kontrollerinin syntax’ına, yani sözdizimine bakalım.
<asp:textbox id="Name" runat="server"/> satırı aslında alıştığımız HTML tag’lerinden pek de farklı değil. Ancak normal html tag’leri ile kullandığımız <tag>bla bla </tag> yazımı yerine burada tag’i kapatmak için <tag ozellik=”asdf” /> şeklinde bir yazım kullanıyoruz. Eğer isteseydik yukarıdaki textbox kontrolünü
<asp:textbox id="Name" runat="server"></asp:textbox>
şeklinde de yazabilirdik. </asp:dropdownlist> satırı bu şekilde kapatılan bir kontrolü gösteriyor. Eğer metin kutusuna deneme yazdıktan sonra formu gönderir, ve geri dönen sayfanın koduna bakarsak:
<form name="ctrl0" method="post" action="deneme2.aspx" id="ctrl0">
<input type="hidden" name="__VIEWSTATE" value="dDwxMTIxNjIzODQyOzs+" />
<h3> İsim: <input name="Name" type="text" value="deneme" id="Name" />
Departman: <select name="Departman" id="Departman">
<option selected="selected" value="Muhasebe">Muhasebe</option>
<option value="Pazarlama">Pazarlama</option>
<option value="Reklam">Reklam</option>
</select>
<input type="submit" name="ctrl1" value="Ara" />
Bu sayfada da, hidden alan sayesinde kontrollerimize verilen değerlerin saklandığını görebiliriz.Sunu taraflı kontroller sadece textbox, veya dropdown list gibi basit kontrollerle sınırlı değil. Bir sürü son derece faydalı kontrol size sunuluyor, ve eskiden saatlerinizi alan veritabanı bağlantısı gibi karmaşık işler bile bu kontroller tarafından kolayca halledilebiliyor.
Tabii kendi kontrollerinizi de yazabilir, ve istediğiniz yerlerde kullanabilirsiniz. Mesela bir web uygulaması için sürekli yapılması gereken ve birden fazla yerde kullanılan bir veritabanı sorgunuz var. Bu işi yapan bir kontrol yazdıktan sonra projenizde istediğiniz yerde kullanabilirsiniz. Tek yapmanız gereken istediğiniz yerde size ait kontrolü kullanmak.
Peki webforms sadece bu bahsettiğimiz özelliklerden mi ibaret ? Yani bu kadar gürültüyü sadece değerlerini saklayabilen form elamanları için mi kopartıyorum ? :) Tabii ki hayır.
Sunucu kontrollerinin çok önemli bir başka özelliği daha var, o da bu kontroller kullanıldığında oluşabilecek olaylara karşılık gelen kodlar yazabilmeniz. Daha önce bahsettiğimiz “event driven code” yani olay güdümlü kod, bu şekilde yazılabiliyor.
Visual basic, delphi gibi görsel geliştirme araçları kullananlar için bu güzel bir haber, çünkü Ms Visual Studio .NET ile aynı bir VB formu üzerinde çalışır gibi bir web sayfası üzerinde çalışıyor, ve şu düğmeye basılınca bu metin değişsin, veya bu listbox ‘a veritabanından şu bilgiler yazılsın diyebiliyorsunuz.
Eğer VS.NET ile çalışma şansınız yoksa, bir kaybınız yok, çünkü yine notepad ile bile event driven kod yazma imkanınız var. Bir parça da bu konu hakkında pratik yapalım.
<title>WebForms örnek sayfası -3-</title>
<script language="VB" runat=server>
Sub SubmitBtn_Click(Sender As Object, E As EventArgs)
Mesaj.Text = "Merhaba " & isim.Text & ", Seçtiğiniz kategori: " &
kategori.SelectedItem.Text
End Sub
</script>
<form action="deneme3.aspx" method="post" runat="server">
<h3> İsim: <asp:textbox id="isim" runat="server"/>
Kategori: <asp:dropdownlist id="kategori" runat=server>
<asp:listitem >Güncel</asp:listitem>
<asp:listitem >Mizah</asp:listitem>
<asp:listitem >Teknoloji</asp:listitem>
<asp:button text="ARA" OnClick="SubmitBtn_Click" runat="server"/>
<p>
<asp:label id="Mesaj" runat="server"/>
Yukarıdaki sayfamız tahmin edeceğiniz gibi deneme3.aspx . Bu sayfayı çalıştırdığımızda ilk başta bir önceki örnekte olduğu gibi boş bir form sayfası ile karşılaşıyoruz. İsim kutucuğuna adımızı girip ara düğmesine tıklarsak, girdiğimiz metnin ve kategorinin kullanıldığı “Merhaba isim, Seçtiğiniz kategori: kategori” şeklinde bir mesaj görüyoruz. Peki bunda ne var diyebilirsiniz, sonuçta normal ASP ile yapamayacağımız sihirli bir numara değil. Ama bu basit örnek çok karmaşık web yazılımlarını yazabileceğiniz bir sisteme ait ipuçları veriyor. Biraz daha yakından bakalım:
İşte bu kısım bizim ara düğmesine tıklandığında ne olacağını belirttiğimiz kod parçası. Dil olarak VB script kullanıyoruz, aslında C# kullanmak isterdim ama en azından dil açısından kafa karışıklığını biraz azaltmak istedim :) Sub ile başkayan satırda, SubmitBtn_Click isimli prosedürü tanımlıyoruz. ( Ufak bir hatırlatma VB, bir değer döndürmeyen fonksiyonlar için bu gördüğümüz sub tanımını kullanıyor ) . Beklenen parametreleri gösteren (Sender As Object, E As EventArgs) kısmını bu yazı için geçiyoruz, sadece bu parametrelerin .NET framework ile ilgili bir standart sebebiyle yazılmak zorunda olduğunu bilmeniz yeterli. Zaten sub içinde bu parametreleri de kullanmıyoruz. Sub içinde ne yaptığımıza bakarsak: “mesaj” adını verdiğimiz label kontrolünün içeriğini, metin kutusuna girilen değer ve seçilen kategori ile değiştiriyoruz. Şimdi bu saydaki işleyişi adım adım gözden geçirelim:
Mesaj.Text = "Merhaba " & isim.Text & ", Seçtiğiniz kategori: " & kategori.SelectedItem.Text
Satırı ile label’in içerdiği metin değişiyor. Burada bir başka önemli nokta da , label kontrolünün aynı görsel yazılım geliştirme araçlarında (VB, Dephi ) sağlanan kontroller gibi bir “text” property’si sağlaması, ve bizim bunu kod ile değiştirebilmemiz.
İlk bakışta biraz karmaşık gibi görünebilir, ancak bir iki kere dikkatle incelerseniz, kolayca kavrayabilirsiniz. Bu örnek, biraz yukarıda belirttiğim gibi biraz kısa da olsa, WebForms ile gelen programlama modelini basitçe özetliyor. Bu sistemi kullanarak bir çok uygulamayı mevcut metodlardan çok daha verimli ve kolay şekilde oluşturmanız mümkün. Bir de bizim burada kullandığımız kodun büyük kısmının VS.NET tarafından otomatik olarak oluşturulması gibi bir olanak var ki, işimizi iyice kolaylaştırıyor.
Bu noktaya kadar gördüklerimizi kısaca özetleyelim:
Şimdi bir parça düşünerek, bu bilgiler ile WebForms için nasıl uygulama alanları bulabileceğimize bakalım. Mesela bir firmanın çalışanlarına ait bilgileri veya stoktaki malları arayıp, sonuçları görebileceğimiz bir sayfayı kolaylıkla bu yapıya oturtabiliriz. Veya hemen her ticari sitede kullanılan alışveriş sepeti modülü için oldukça pratik bir çözüm olabilir. ( Sepette yapılan bir kitaptan birkaç tane alma, fiyatı yeniden hesaplama, veya bir kitabı sepetten çıkarma gibi işlemler sepet sayfasının bir form olarak tasarlanması ve tekrar kendine gönderilmesi yöntemi ile yapılır. )
Tabii önemli bir diğer nokta da, burada verdiğim son derece sınırlı bilgilerin , bir çok sorunu tamamen çözmekte yetersiz kalacağı :) .NET ve ASP.NET son derece geniş ve karmaşık sistemler , ve bunun gibi belki yüzlerce yazı bile sizi tamamıyla bu yapıya hakim kılmaz. Biraz daha açarsak, burada sözünü bile etmediğimiz bir çok yenilik anlatılmak için sırasını bekliyor. WebForms’un teknik altyapısı, server controls, validation controls, codebehind gibi “ O ne yahu ?” dedirten bir çok kavramı zamanla gördükçe, ASP.NET ile gelen yenilikleri daha iyi kavrayacak, ve konuya daha hakim hale geleceksiniz.Ancak bunu yapmak için mümkün olduğunca çok araştırmanız, okumanız ve çalışmanız gerekiyor. Eh, Web’in her yeri kaynakla dolu olduğuna göre, klavyenize, ve gözlerinize kuvvet.
Yukarıda bahsettiğim konularda başka yazılarda görüşmek üzere...