Makale Özeti

Kendi sunucu kontrollerinizi oluşturmabilmek için bir başlangıç.

Makale

ASP.NET Sunucu Kontrolü Oluşturmak - 1

Bir çok ASP.NET uygulama geliştiricisi kullanıcı kontrolü (.ascx) oluşturmuştur. Bu kontroller .ascx uzantılı ve .vb (.cs) kodundan derlenmiş kod ile çalışır. Kullanıcı kontrolleri uygulama bağımlıdır. Sadece kullanıcı kontrolünü eklediğiniz uygulama içerisinde yeniden kullanılabilirliğe sahiptir. Örneğin bir DataGrid, TextBox, Button, Calendar ASP.NET sunucu kontrolüdür. Sunucu kontrolleri ise tamamen kod ile yazılan (.ascx olmadan) ve .net dllleri olarak çalıştırılan kontrollerdir. Sunucu kontrollerinin yeniden kullanılabirliği uygulama bazında kısıtlı değildir. Bir sunucu kontrolünü birden fazla proje içerisinde sadece dll dosyasının istenilen uygulamanın /bin klasörüne kopyalanması ile yapılabilir. Hatta strong named assembly olarak yapılandırılmış bir sunucu kontrolü sistem üzerinde GACe kaydedilerek tüm uygulamalar tarafından tek kaynaktan kullanılabilir.

Ayrıca sunucu kontrolü geliştirilmesi ayrı bir pazara sahiptir. .NET Framework içerisinde yer almayan bazı özellikleri sunan sunucu kontrolleri programlayarak (eğer gerçekten buna değecek kapasitede ise) satışını yapabilirsiniz. Örneğin bazı ASP.NET sunucu kontrolleri için 123aspx.com sitesindeki Components & Server Controls dizini, bu dizin altındaki Menu dizinlerini inceleyebilirsiniz. Pazarlanabilecek kadar kaliteli bir kontrol yazmak bir hayli zaman alacaktır.

Kendi sunucu kontrollerinizi yazmak için .NET Framework e sahip olmanız yeterlidir. Ayrıca bir editore ihtiyacınız yoktur. Notepad kullanarak dahi bir sunucu kontrolü oluşturabilirsiniz. Tabiki Visual Studio.NET editörünün ne kadar yetenekli ve işinizi kolaylaştırıcı olduğununda altını çizmek gerekir. Ben uygulama geliştirmek için VS.NET i kullanıyorum.

ASP.NET sunucu kontrolleri yazdığınız program kodunu verilen parametreler ile çalıştırır ve HTML ve JavaScript gibi istemcinin anlayacağı çıktılar üretir. ASP.NET sunucu kontrolü oluşturmak için oluşturacağınız bir sınıfı ASP.NET sunucu kontrolleri temel sınıflarından miras alacak şekilde programlamalısınız. Her ASP.NET sunucu kontrolü System.Web.UI.Control veya bu sınıftan türemiş olan sınıflardan (System.Web.UI.WebControls.WebControl) türer. Yani ASP.NET sunucu kontrollerinin kökü System.Web.UI.Control sınıfıdır.

Sunucu kontrollerinde kullanılabilecek olan temel sınıflar aşağıdaki UML diyagramında hiyerarşisine uygun şekile gözükmektedir.

System.Web.UI.Control sınıfı bir sunucu kontrolü için kök sınıftır. Bu sınıf ile bir kontrolün sayfa üzerinde yer alabilmesi için temel işlevler sağlanır. Bu sınıfın System.ComponentModel.IComponent arayüzünü uygulaması sayesinde bu sınıftan miras alarak oluşturulan tasarlanabilirler. Visual Studio.NET üzerinde Toolbox pencresine eklenebilirler ve diğer tasarım zamanı işlemlerini gerçekleştirebilirler.

System.Web.UI.WebControls.Control sınıfı ise System.Web.UI.Control sınıfını miras aldığı için aynı özellikleri sağlar ayrıca Font, Height, Width, BackColor gibi bazı özellikler içerir.

Peki hangisinden miras almalı?

Ne zaman System.Web.UI.Control?

Eğer kontrolünüz html olarak görsel bir unsur içermiyorsa. Örneğin sadece javascript veya görsel olmayan html etiketleri (xml,meta,title) basıyorsa.

Ne zaman System.Web.UI.WebControls.WebControl?

Eğer kontrolümüz görsel html öğeleri içeriyorsa bu kontrolü kullanmak ek özellikler sayesinde esneklik sağlayacaktır.

Başka ne olabilir?

Label, TextBox, Calendar, DataGrid gibi var olan sunucu kontrollerinden miras alan uygulamalar yapılabilir. Bu seçenek zaten var olan kontrolün bazı özelliklerini istediğini gibi düzenlemek istediğiniz zaman veya ek özellikler eklemek istediğiniz zaman kullanılmalıdır.

System.Web.UI.Control sınıfından miras alan basit bir kontrol oluşturalım.

Bunun için VS.NET içerisinden yeni bir Class Library yada Web Control Library projesi açın. Class Library açarsanız System.Web.dll dosyasına referans eklemeniz gerekir. Web Control Library açarsanız içinde WebControl sınıfından miras alan hazır bir proje açılır. Class Library türünden farkı yoktur. Sonuçta iki projede bir dll dosyası çıkarır. Miras alan sınıfları nasıl olsa biz yazacağız.

Yeni bir sınıf oluşturduğunuzda System.Web.UI.Control sınıfından miras alması sağlayacak kodu yazın. Buradan sonra iş HTML çıktısını üretmekte. Kontrolün HTML çıktısı sağlaması için Overridable olan Render metodunun Override edilmesi gerekir.

BasitKontrol kontrolü aşağıda gözükmektedir.

Public Class BasitKontrol
Inherits System.Web.UI.Control

Protected Overrides Sub Render(ByVal writer As System.Web.UI.HtmlTextWriter)
writer.Write("Merhaba Sunucu Kontrolleri Dünyası")
End Sub

End Class

Render metodunun override tanımlamasını kolayca oluşturmak için şekilde gözüktüğü gibi VS.NET arabirimini kullanabilirsiniz.

Yukarıdaki şekildeki gibi BasitKontrol sınıfın Override listesi seçtikten sonra bu açılan menünün hemen yanındaki açılan menüden Render metodunu seçerek, tıklamanız gerekli override metod tanımlamasını ekleyecektir.

Override edilen Render metoduna parametre olarak gelen HtmlTextWrite nesnesini kullanarak kontrolünüzün çıktısını basabilirsiniz.

Yukarıdaki kodu sunucu kontrolü için açtığınız projenize ekleyip projenizi derleyin. Ardından bir web uygulaması projesi açarak hazırladığınız projeyi test edin. Bu projeyi aynı solutiona eklerseniz test aşamasında işiniz kolaylaşacaktır. Ardından WebFormunuz tasarım düzenin açıkken ToolBoxa sağ tıklayıp. Add/Remove Items seçeneği ile daha önce oluşturduğumuz BasitKontrol sunucu kontrolü sınıfının yer aldığı projenin çıktısı olan dll dosyasını Browse düğmesi ile araştırıp bulun ve ekleyin.

Toolboxda gözüken BasitKontrol kontrolünü sürükle bırak ile WebForm üzerine sürükleyin.

Test amaçlı hazırladığımız Web uygulamasını çalıştırdığınızda tasarım zamanında gözüken görüntüye benzer bir görünüm elde edeceksiniz.

Yukarıdaki şekilde çalışma zamanında sunucu kontrolümüzün oluşturduğu sayfanın html ve tarayıcı gözükmektedir. Notepad görüntüsünde gördüğünüz gibi kontrolümüz tarafından sayfaya sadece HtmlTextWriter nesnesi ile yazdırdığımız içerik basıldı.

İlerleyen uygulamalarda kullanıcıdan aldığı verilere bağlı olarak içerik üreten kontroller hazırlayacağız.

Peki System.Web.UI.WebControls.WebControl sınıfından miras alsaydık nasıl yapardık?

Eğer Control sınıfı yerine WebControl sınıfından miras alsaydık. kontrolümüz bazı ek özelliklere sahip olacaktı. Font, Height ve diğer bazı görünüm özellikleri. WebControl sınıfın Control sınıfından temel farkı kontrolümüzün görünümü ile ilgili bazı ek özelliklere ve çıktılara sahip olmasıdır.

WebControl sınıfından miras alırken:

  • Render metodunu override etmemeliyiz. Çünkü WebControl sınıfı kontrolümüz için başlangıç ve bitiş niteliğindeki iki etiketi burada basar. Basılan bu etiket kontrolümüzün görsel özelliklerini belirleyen style özelliğini de içerir.

  • Kontrolümüzün çıktısını basmak için RenderContents metodu override edilmelidir.

  • WebControl sınıfı RenderContents metodunu override ederek bastığımız içeriği etiketleri ile çevreler ve kontrolümüzün görsel ayarlarını burada belirler. (Bu etiket TagKey ve TagName özellikleri override edilerek kontrolümüz içerisinde değiştirilebilir.)

System.Web.UI.WebControls.WebControl sınıfından miras alan basit bir kontrol oluşturalım.

Açık olan web kontrolü projemize yeni bir sınıf ekleyin. BasitKontrol2. Bu sınıfı aşağıdaki şekilde düzenleyin.

Public Class BasitKontrol2
Inherits System.Web.UI.WebControls.WebControl

Protected Overrides Sub RenderContents(ByVal writer As System.Web.UI.HtmlTextWriter)
writer.Write("Merhaba Sunucu Kontrolleri Dünyası (BasitKontrol2den)")
End Sub

End
Class

Yukarıdaki kod bloğunda System.Web.UI.WebControls.WebControl sınıfından miras alan BasitKontrol2 ismin bir sunucu kontrolü sınıf gözükmektedir.

System.Web.UI.WebControls.WebControl sınıfından miras alan sunucu kontrollerinde çıktıyı sağlamak için RenderContents metodu override edilmedir. Render metodunun override edilmemesinin sebebi o metodda kontrollerimizin çıktısını kapsayan html etiketleri () basılarak kontrolümüzün görsel özelliklerinin burada ayarlanmasıdır. Hatırladığınız gibi WebControl sınıfının Control sınıfından farkı kontrolün görsel özelliklerinin belirlenebilmesini sağlayan özellikler içermesiydi.

Yeni oluşturduğunuz BasitKontrol2 sınıfı ile beraber sunucu kontrolümüzü tekrar derleyelim. Web uygulamamızda ToolBox penceresinde ikinci kontrolümüzünde gözükmesi için ToolBox penceresinde zaten var olan BasitKontrol kontrolünün üzerine sağ tıklayıp Delete seçeneğini seçerek ToolBoxdan silelim. Ardından daha önce yaptığımız adımları tekrarlayarak DLL dosyamızı kullanarak kontrollerimizi tekrar ToolBoxa ekleyelim. Bu eklem işlemi yapıldıktan sonra ToolBox yukarıdaki şekildeki gibi gözükecektir. WebForm unuz tasarım görünümünde açıkken BasitKontrol2 kontrolünün sürükleyip WebForm umuza bir örneğini ekleyelim. Yukarıdaki WebForm görüntüsünü elde etmiş olmalıyız.

Uygulamamızı çalıştırıp çıktısını kontrol edelim.

Yukarıdaki resimde gözüktüğü gibi ilk yaptığımız kontrolümüz olan BasitKontrol yine sadece belirlenen metni çıktı olarak üretiyor.

İkinci karede gözüken BasitKontrol2 kontrolümüz ise WebControl sınıfından miras aldığı için etiketleri arasına çıktısını üretiyor. Şekilde gözüken span etiketlerinin style özelliğinden poziyon belirleyen stil tanımlamaları VS.NET editorü üzerinde kontrolümüzü konumlandırırken VS.NET tarafından eklenen etiketler. Eğer VS.NETde sayfamızı flowlayout modunda tasarlasaydık bunlar zaten eklenmezdi.

Not: Control sınıfından türetilerek programlanan sunucu kontrolleri VS.NET tasarım aracında GridLayout modunda istenilen konuma yerleştirilemez. Sayfanın istenilen konumuna getirebilmek için tablolar ile tasarım yapmak gerekir.

WebControl sınıfını kullanmadaki temel amacımız olan görsel biçimlendirmedeki farkını nasıl görebiliriz?

Yukarıdaki gözüken resimde birinci (alttaki) resimde birinci kontrol olan BasitKontrol kontrolümüz seçili bu kontrol seçili iken Properties penceresi ile bu kontrolün Control sınıfından hangi özellikleri miras aldığını görebiliyoruz. Görsel tasarım ve biçimlendirme ile ilgili bir özellik yok.

İkinci resimde (üstteki) ikinci kontrolümüz olan BasitKontrol2 kontrolümüz seçili iken Properties penceresi ile bu kontrolün WebControl sınıfından hangi özellikleri miras aldığını görebiliyoruz. Görsel tasarım ve biçimlendirme ile ilgili özellikler kullanıma hazırlar.

Şimdi bu görsel biçimlendirme özelliklerinin kontrolümüz nasıl etkilendiğini görelim. İkinci kontrolümüzü seçip Properties penceresinden arkaplan rengini, yazıtipini ve bir kaç diğer özelliğini düzenleyerek çıktısını görelim.

Yukarıdaki şekilde BasitKontrol2 kontrolümüzü biçimledirdikden sonra uygulamamızı çalıştırıp çıktısını görüntüleyelim.

Yukarıdaki şekilde uygulamanın çalışma zamanında ürettiği html çıktısı gözükmektedir. RenderContents metodunu override ederek yazdırdığımız çıktıyı çevreleyen etiketlerinin style özelliğinde altı çizili olan bölgeler kontrolümüzün tasarım zamanında ayarladığımız özelliklerini belirtmektedir.

ASP.NET Sunucu Kontrolleri Oluşturmak başlıklı 3 makaleden oluşacak bu yazı dizisinin birincisinde ASP.NET sunucu kontrolü oluşururmaya başlamadan önce konunun temelleri üzerinde durduk. Hangi sınıflar miras alınabilir? Bunlardan hangileri hangi durumda kullanılır. Ve bu yöntemlerin temel niteliğindeki uygulamaları ile miras alınacak iki sınıf arasındaki farkın kavradık.

Bir sonraki yazımızda kullanıcıdan aldığı verileri işleyerek bu veriler doğrultusunda çıktı oluşturan kontrolleri ve bunların VS.NET tasarım arabirimindeki desteklenmesini anlatacağım.

Bir dahaki makaleye kadar sunucu kontrolleri ile ilgili soru ve kendi çözümleriniz ile benimle iletişim kurabilirsiniz.

Umarım faydalı bir makale olmuştur.
Konu ile ilgii geri bildirimlerinizi bekliyorum.

Örnek projeyi indirmek için tıklayınız.

Cengiz HAN
Microsoft ASP.NET MVP
cengizh@yazgelistir.com
www.cengizhan.com