Makale Özeti

Bu makalemizde ASP.NET sayfaları içerisinde önemli ayarlamalar yapmamızı sağlayan sayfa direktiflerini (page directives) ele alıyoruz.

Makale

Sayfa direktifleri, ASP.NET uygulamalarında bir sayfanın temel anlamdaki özelliklerini, davranışlarını, kullanacağı bazı dış kaynakların tanımlamalarının yapılmasını sağlayan ve ASP.NET sayfalarının Source kısmında (HTML kodlarının olduğu kısımda) en üste yerleştirilen kod parçalarıdır. Sayfa direktifleri ile yapılan ayarlamalar sayfanın derleyici tarafından nasıl çalışacağını, nasıl ele alınacağını ve hangi kaynakları kullanacağını belirler. Bu anlamda bir ASP.NET sayfası ile çalışırken bu tip ayarlamaları yapmamızı sağlayan sayfa direktifleri yakından tanımak, kullanımına hakim olmak, biz ASP.NET programcıları için önemli olacaktır.

Sayfa direktifleri ASP.NET'in 1.0 sürümünden beri tüm sayfalarda kullanılmaktadır. ASP.NET 2.0 ile birlikte gelen bazı yeni dosya tipleri (Master Sayfalar gibi) ve çalışma mekanizmaları (CrossPage Postback gibi) ile birlikte, yeni sayfa direktifleri de ASP.NET'in yapısına eklenmiştir. Bu makalemizde bir sayfada kullanılabilecek tüm direktifleri detaylı bir şekilde ele alıyor olacağız. Aşağıdaki listede ASP.NET sayfalarında kullanılabilecek sayfa direktiflerinin listesi bulunmaktadır.

1. Page
2. Assembly
3. Control
4. Implements
5. Import
6. Master
7. MasterType
8. OutputCache
9. PreviousPageType
10. Reference
11. Register

Aslında listenin ilk sırasında gördüğümüz Page direktifi bize oldukça tanıdık gelecektir. Zira her .aspx uzantılı sayfanın HTML kodlarının en üst kısmında bulunan Page direktifi üzerinde değişiklik yapmasak dahi ne amaçla kullanıldığını az-çok bilmekteyiz. Page direktifinin kullanımını şöyle bir bakacak olursak;
    <% @Page ...... %>
şeklinde bir tanımlamaya sahip olduğunu görürüz. Aslında bu tanımlama tüm sayfa direktifleri için geçerli bir tanımlama şeklidir. Yukarıdaki listede gördüğünüz 11 sayfa direktifi <% @DirektifAdı şeklinde başlar, devamında gerekli niteliklerine (attribute) atamalar yapılarak ayarlamalar yapılır ve %> ifadesi ile de direktifin sonlandırıldığı derleyiciye bildirilir. Burada görülen <% %> ifadeleri asp söz diziminde, sunucu tarafında çalıştırılacak etiket anlamına gelmekte, @ işareti ise çalıştırılacak ifadenin bir sayfa direftifi ifadesi olduğunu belirtir. Direktif içerisinde ise gerekli tanımlamalar NitelikAdı="Değeri" şeklinde yapılacaktır.

Dilerseniz sayfa direktiflerinin kullanımını, gerekli ve önemli nitelikleri ile birlikte tek tek ele alalım.

1. Page Direktifi
Page direktifi ASP.NET sayfalarında kullanılan en temel ve önemli direktiftir. İçerisinde yapılan tanımlamalar ile bulunduğu sayfanın derleyici tarafından nasıl, ne şekilde ele alınacağını ve hangi özelliklerle birlikte derlenip çalıştırılacağını belirler. Page direktifi zorunlu olmamakla birlikte, tüm .aspx sayfalarında bulunmaktadır. Page direktifi ile birlikte kullanılacak önemli nitelikler (attribute) aşağıda bulunmaktadır.

- Async: Sayfanın asenkron şekilde çalışmasını belirler. true değeri alırsa sayfa asenkron şekilde çalışabilir hale gelir, false değer aldığında senkron şekilde çalışır.
- AutoEventWireup: Sayfanın yaşam döngüsü içerisinde olayları (event) için tanımlanmış olan metot isimlerinin kullanılıp kullanılmayacağını belirler. Eğer true değeri alırsa Page_Init, Page_Load, Page_PreRender gibi önceden tanımlanmış metot isimleri olaylara bağlanarak kullanılır. Eğer false değeri alırsa kullanıcı kendisi olaylara farklı metot isimleri bağlayabilir. Varsayılan değeri true'dur.
- CodeFile: Sayfanın code-behind dosyasını belirler. Yani aspx sayfası çalıştırıldığında hangi kod sayfası ile birlikte derleneceği bu nitelik ile belirlenir. Default.asp.cs gibi.
- Culture: Sayfanın para birimi, tarih ve ölçü birimleri gibi kültür (culture) bilgilerinin hangi dile göre getirileceğini belirler.
- UICulture: Sayfanın görsel arayüzündeki dile göre değişebilen içeriklerin sayfa oluşturulduğunda hangi dil kullanılarak üretileceğini belirler.
- EnableTheming: Site genelinde tema ayarlamaları açık ise, temalandırma işleminin sayfaya uygulanıp uygulanmayacağını belirler. Eğer web.config'den uygulama için bir tema ayarlaması yapılmış ise ve bu nitelik true değerini taşırsa tema sayfaya uygulanır, false değerini taşırsa tema sayfaya uygulanmaz.
- EnableViewState: Sayfa içerisindeki kontrollerin PostBack işlemi sonucunda değişen özelliklerinin ViewState nesnesi içerisinde taşınıp taşınmayacağını belirler. true değeri alırsa sayfadaki bütün kontrollerin özellikleri ViewState'de taşınır, false değeri alırsa taşınmaz. Varsayılan değeri true'dur.
- ErrorPage: Sayfada hata oluşması durumunda, sayfanın hangi hata sayfasına yönlendirileceğini belirler.
- Inherits: Sayfanın compile işlemi yapılırken hangi sınıftan (class) kalıtılacağını ve hangi sınıfın örnekleneceğini belirler. Varsayılan olarak sayfanın code-behind dosyasında yazılan sınıf adı, yani dosya ile aynı ismi taşıyan sınıf adı bu değere atanır. Default2.aspx sayfasında Default2 gibi.
- Language: Sayfanın hangi .NET destekli dil ile yazıldığını belirler. C# dilinde yazılmış ise C#, VB.NET dilinde yazılmış ise VB gibi.
- MasterPageFile: Sayfa eğer bir master sayfadan türetilmiş ise, türetilen master sayfanın adı atanır. SiteMaster.master isimli master sayfadan türetilen sayfa için SiteMaster.master bilgisini taşır.
- MaintainScrollPositionOnPostback: Sayfanın PostBack işlemi sonucunda yenilenmesi durumunda, sayfanın otomatik olarak kullanıcının son olarak konumlandığı yere getirilmesi işlemini yapar. Yani kullanıcı scroll bar ile sayfayı aşağıya doğru hareket ettirip, ardından da sayfayı yenilerse, yenileme işlemi sonrasında tarayıcı sayfanın en üstüne değil de kullanıcının son olarak kaldığı kısma konumlanır. true değeri alırsa burada bahsedildiği gibi davranır. false değeri alması durumunda ise yenileme işlemi sonunda sayfanın en üstüne gelinir.
- Theme: Sayfanın App_Themes klasöründe oluşturulmuş site şemalarından birini uygulamasını sağlar.
- Title: Sayfanın tarayıcıdaki başlık bilgisini belirler.
- Trace: Sayfada trace (izleme) işlemlerinin yapılıp yapılmayacağını belirler. Varsayılan değeri false'dur ve trace işlemi yapılmaz. true değeri atandığında sayfada trace işlemi yapılır.
- ValidateRequest: Sayfadaki bilgilerin sunucuya gönderilmesi esnasında, form içerisinde taşınan bilgilerde güvenlik açısından sorun çıkarabilecek içerikler var ise (örneğin kullanıcı bir TextBox içerisinde <span> <b> <script>....</script> gibi ifadeler yazdıysa) sayfanın hata vermesini ve bilgilerin gönderiminin iptal edilmesini sağlar. Güvenlik açısından önemli bir niteliktir. Varsayılan değeri true'dur ve yukarıda bahsedildiği gibi bir işlem gerçekleşirse işlemi iptal eder ve hata verir. false ise tehlikeli bir içerik bulunsa bile gönderilen bilgileri kabul edecektir.

Aşağıdaki kod örnekğinde bir ASP.NET sayfasına uygulanabilecek Page direktifi görülmektedir.

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default"
          Culture="tr-TR" UICulture="tr-TR" EnableViewState="false" ErrorPage="Hata.aspx" %>

Yukarıdaki örnekte sayfanın C# dili ile kodlandığı, sayfa olaylarının varsayılan metotlara bağlandığı, sayfanın C# kodlarının Default.aspx.cs dosyasında bulunduğu, sayfanın _Default adında bir sınıftan türetildiği, sayfanın kültür (culture) bilgisinin tr-TR yani Türkçe dili olduğu, sayfa içerisindeki kontrollerin değerlerinin ViewState içerisinde saklanmayacağı ve sayfada bir hata oluşursa sayfanın otomatik olarak Hata.aspx isimli sayfaya yönlendirileceği belirtilmiştir.


2. Assembly Direktifi
İlgili sayfaya kullanıcının oluşturmuş olduğu bir assembly'nin eklenmesini sağlar. Böylece sayfa içerisinde ilgili assembly'de bulunan tipler (class, struct gibi)  kullanabilmektedir. web.config dosyası içerisinde <assembly> düğümüne add etiketi ile uygulamaya assembly ekleme işleminin sayfa bazında yapılmasını sağlar. Assembly direktifinin alabileceği iki nitelik vardır:

- Name: İlgili assembly'nin adının verilmesi gereklidir. Burada assembly dosyasının uzantısını yazmaya gerek yoktur.
- Src: İlgili assembly dosyasının bulunduğu yer ve dosya adının verilmesi gereklidir.

Assembly direktifinin örnek kullanımları aşağıda görülmektedir.

<%@ Assembly Name="AssemblyIsmi" %>

Assembly direktifinin iki niteliği de aynı işlemi yapmakta ve bir Assembly direktifi içerisinde aynı anda bunlardan sadece bir tanesi kullanılabilmektedir.


3.Control Direktifi
Bir user control'ünün (kullanıcı kontrolü) özelliklerinin belirlenmesini sağlar. Böylece ASP.NET'in bu user control'ünü ne şekilde ele alacağı ve nasıl derleyeceği belirlenir. Bildiğiniz gibi user control'ler ascx uzantısı ile saklanan, içerisinde ASP.NET kontrolleri ve HTML kodları bulundurabilen ve ASP.NET web sayfalarının belirli parçalarını oluşturan dosya tipleridir. Bir aspx sayfası içerisindeki Page direktifi ile ascx kontrolünde kullanılan Control direktifinin hemen hemen aynı işlevleri olduğunu söyleyebiliriz. Control direktifi sadece user control'lerinde kullanılabilmektedir. 

Control direktifinin nitelikleri, Page direktifinin niteliklerine göre az sayıda olmakla beraber, niteliklerin kullanımı ve yaptıkları işlemler hemen hemen aynıdır. Yukarıda, Page direktifi kısmındaki niteliklere ve açıklamalarına göz atmak, Control direktifinin kullanımı ile ilgili bize yeterli bilgi verecektir. Aşağıda Control direktifinin bir user control'ünde kullanımı ile ilgili bir örnek yer almaktadır.

<%@ Control Language="C#" AutoEventWireup="true" CodeFile="Login.ascx.cs"
          Inherits="Login" EnableViewState="false" %>


4. Implements Direktifi
.NET Framework'te tanımlı olan bir interface'i (arayüz) sayfaya uygulamak için kullanılan direktiftir. Uygulanan interface'e ait metotlar ve property'ler (özellik) aspx dosyası içerisinde açılacak <script> etiketinde yazılarak sayfaya uygulanabilir. Implements direktifi sadece Interface niteliğini kullanmaktadır.

- Interface: Sayfaya uygulanacak .NET interface'inin belirtilmesi gereklidir.

Aşağıdaki örnekte, System.Web.UI namespace'i (isim alanı) altında yer alan IValidator isimli interface'in bir sayfaya Implements direktifi ile uygulanışı görülmektedir.

<%@ Implements Interface="System.Web.UI.IValidator" %>


5. Import Direktifi
Sayfaya bir namespace'in eklenmesi için kullanılan direktiftir. .NET Framework yapısında bulunan veya projede tanımlanmış olan herhangi bir namespace Import direktifi ile sayfaya eklenebilir. web.config dosyası içerisinde uygulama genelinde kullanılabilecek namespace'lerin eklenmesi gibi, sadece bir sayfaya namespace'lerin eklenmesi işlemi için de Import direktifi kullanılabilir. Import direktifi ile sadece Namepace niteliği kullnılır.

- Namespace: Sayfaya eklenecek namespace'in belirtilmesi gerekir.

Aşağıdaki örnekte Import direktifi ile bir sayfaya namespace eklemeleri yapılmıştır.

<%@ Import Namespace="System.Data.SqlClient" %>
 <%@ Import Namespace="KendiIsimAlanim" %>


6. Master
Bir Master page'in özelliklerinin belirlenmesini sağlayan direktiftir. Page direktifi web form sayfalarında(aspx), Control direktifi user control'lerde(ascx) olduğu gibi, Master direktifi de master page'lerin ASP.NET derleyicisi tarafından ne şekilde ele alınacağını belirler. Kullanılan nitelikler ve niteliklerin kullanım amaçları Page ve Control direktifleri ile hemen hemen aynıdır. Bu nitelikler için Page direktifi kısmındaki nitelik açıklamalarına göz atabilirsiniz. Aşağıda bir master page dosyasında kullanılabilecek Master direktifi görülmektedir.

<%@ Master Language="C#" AutoEventWireup="true" CodeFile="SiteSablonu.master.cs" Inherits="SiteSablonu" %>


7. MasterType
Master page'den türetilen bir ASP.NET sayfasındaki Page.Master property'si MasterPage tipinden bir değer döndürmekte ve böylece master page ile ilgili işlemler yapılabilmektedir. Bazı durumlarda master page sınıfı içerisinde tanımlanmış özel bir property (özellik) veya metoda Page.Master özelliği ile direkt olarak erişilmek istenilebilir. Böyle bir durumda Page.Master özelliğini ilgili master page'in tipine cast (dönüştürme) işlemi yapmak gerekecektir. İlgili sayfadan master page'in nesne örneğine cast işlemi yapılmadan erişilmek istenilirse, bu sayfaya MasterType direktifi eklenmesi gerekecektir. MasterType direktifi içerisinde tanımlanan master page'in otomatik olarak Page.Master özelliğinin geri dönüş tipi olmasını sağlar ve böylece master page'deki özel property veya metoda direkt olarak erişme işlemi gerçekleştirilebilir. Aşağıda MasterType direktifinin alabileceği nitelikler ve bu niteliklerin açıklamaları yer almaktadır.

- TypeName: Content page'de Master özelliğinin geri dönüş tipi olması istenilen master page'in tip adını alır.
- VirtualPath: Content page'de Master özelliğinin geri dönüş tipi olması istenilen master page dosyasının dosya yolunu ve ismini alır.

Örnekteki MasterType direktifi, content page içerisindeki Master özelliğinin geri dönüş tipinin SiteSablonu.master isimli master page dosyası olduğunu belirler.

<%@ MasterType VirtualPath="~/SiteSablonu.master" %>


Resim-1: MasterType direktifi eklenilmediğinde Page.Master property'si MasterPage nesne örneğini getirir ve master page'deki üyelere erişmek için cast işlemi gerekir


Resim-2: MasterType direktifi eklendiğinde artık Page.Master property'si master page'in nesne örneğini getirir


Resim-3: Master property'si master page'in nesne örneğini getirdiği için content page'den direkt olarak master page üyelerine erişebiliriz


8. OutputCache
ASP.NET uygulamalarında sayfanın çıktısını önbelleğe alma işlemlerinde (Caching) kullanılan direktiftir. Sayfaya OutputCache direktifini eklediğimizde ve gerekli nitelikleri tanımladığımızda, sayfanın HTML çıktısı bellekte saklanır, sayfa belirli bir süre boyunca tekrar çalıştırılmaz ve bellekten okunur. OutputCache direktifi ile yapılan önbellekleme işlemleri sayfanın daha hızlı şekilde istemciye gönderilmesini sağlar.

- CacheProfile: web.config içerisinde tanımlı olan Cache profillerinden birinin sayfaya uygulanılması istenilen durumda kullanılan niteliktir.
- DiskCacheable: Verilerin disk ve benzeri bir depolama cihazına alınıp alınamayacağını belirler.
- Duration: Önbelleğe alınacak sayfanın ne kadar süre ile bellekten okunacağını belirler. Saniye cinsinden rakamsal değer almaktadır.
- Location: Önbelleklenen verilerin nereye kaydedileceğini belirler. Varsayılan olarak Any değerini taşır. Bu değer verilerin istemci, proxy ve sunucuda taşınabildiğini belirtir. İstenirse sadece sunucuda, istemcide veya proxy'de saklanması sağlanabilir. Alabileceği diğer değerler; Client, Server, Downstream, ServerAndClient ve None'dir.
- NoStore: Sayfanın header (başlık) bilgilerinde "no cache" bilgisinin gönderilip gönderilmeyeceğini belirler.
- SqlDependency: Sayfanın SQL Server veritabanındaki bir tablonun değişimine bağımlı olarak önbelleklenmesi durumunda kullanılacak niteliktir. Bu özelliğe değer atayabilmek için, web.config dosyasındaki caching düğümünde bulunan sqlCacheDependency içerisine bir veritabanı tanımlaması yapılmalıdır.
- VaryByControl: Sayfadaki bir kontrolün değişimine göre önbellekleme işleminin yapılmasını sağlar. Değer olarak önbellekleme işleminin yapılmasını sağlayacak kontrolün ID değerini almalıdır.
- VaryByCustom: Farklı değerlere ve kriterlere göre önbellekleme işlemlerinin yapılması durumunda kullanılacak niteliktir. Bu niteliğin alacağı değerin yakalanıp ele alınabilmesi için Global.asax dosyası içerisindeki GetVaryByCustomString isimli metodun ezilmesi (override edilmesi) gerekmektedir.
- VaryByHeader: Sayfanın HTML kısmında yer alan header (başlık) bilgilerine göre önbellekleme işlemlerinin yapılmasını sağlar.
- VaryByParam: Sayfanın Url'den gelen QueryString parametrelerine göre önbelleğe alınıp alınmayacağını belirler. Varsayılan değeri None'dir ve parametreleri dikkate almaksızın sayfanın belleğe alınmasını sağlar. QueryString'deki herhangi bir parametrenin adını alarakta bu değere göre sayfanın farklı kopyalarının önbellekleğe alınabilmesini sağlar. Bu niteliğin her OutputCache direktifi içerisinde yazılması zorunludur.

Aşağıda bir sayfanın HTML çıktısını QueryString bilgisine bakmaksınız 30 saniye süre ile istemcinin bilgisayarında önbelleğe atan OutputCache direktifi bulunmaktadır.

<%@ OutputCache Duration="30" Location="Client" VaryByParam="None" %>


9. PreviousPageType
Cross-Page PostBack işlemlerinde hedef sayfaya gelinen kaynak sayfanın nesne örneğini elde etmek için kullanılan direktiftir. Normal koşullarda sayfanın code-behind kısmında elde ettiğimiz PreviousPage nesnesi Page tipinden nesne örneği döndürmektedir. Eğer PreviousPage nesnesin üzerinden önceki sayfanın nesne örneğini elde etmek istiyorsak sayfa içerisine PreviousPageType direktifi eklemek gerekecektir. PreviousPageType direktifinin alabileceği nitelikler ve açıklamaları aşağıdadır.

- TagName: PreviousPage nesnesinin hangi sınıfın nesne örneğini oluşturacağını belirler.
- VirtualPath: PreviousPage nesnesinin hangi sayfayının nesne örneğini oluşturacağını belirler.

Aşağıdaki PreviousPageType direktifi eklendiği sayfada PreviousPage nesnesinin Source.aspx sayfasının nesne örneğini dönmesini sağlar.

<%@ PreviousPageType VirtualPath="~/Source.aspx" %>

Dilerseniz PreviousPageType direktifinin sayfaya ne gibi bir etkisi olduğunu daha iyi anlayabilmek için aşağıdaki resimleri inceleyelim. Resim-4'te PreviousPageType direktifi eklenmemiş bir sayfada PreviousPage nesnesinin geri dönüş tipinin Page class'ı olduğunu görebilirsiniz. Resim-5'te ise sayfaya PreviousPageType direktifi eklendiğinde sayfanın PreviousPage nesnesinin Source.aspx sayfasının nesne örneğinin döndürdüğü görülmektedir. Böylece artık PreviousPage'den önceki sayfanın nesne örneğine ulaşılabilir ve önceki sayfanın class'ı içerisinde metot, property gibi üyeler çağrılabilir.


Resim-4: PreviousPageType direktifi eklenmemiş bir sayfada PreviousPage nesnesinin geri dönüş tipinin Page class'ıdır


Resim-5: PreviousPageType direktifi eklendiğinde PreviousPage nesnesinin geri dönüş tipi Source.aspx sayfasının nesne örneğidir


10. Reference
Uygulamada bulunan bir ASP.NET sayfasının veya ASP.NET user control'ün sayfaya referans olarak eklenmesi ve sayfa ile birlikte derlenmesini sağlar. Böylece eklenen sayfanın veya user control'ün class'ına sayfa içerisinden erişilebilir.

- Control: Sayfaya referansı eklenecek kontrol dosyasının adı.
- Page: Sayfaya eklenecek olan aspx sayfasının dosya adı.
- VirtualPath: Projede bulunan bir dosyanın yolu ve dosya adı. Page ve Control niteliklerinin yerine de kullanılabilir.

Aşağıdaki Reference direktifi ile sayfaya referansı eklenen Default2.aspx sayfasının class'ına erişilebilir.

<%@ Reference VirtualPath="~/Default2.aspx" %>


11. Register

Register direktifi projede veya bir assembly dosyada bulunan user control'ün sayfaya kayıt edilmesi işleminde kullanılmaktadır. Hazırlanan bir user control'ün sayfadaki HTML etiketleri içerisine ASP.NET sunucu kontrolü gibi eklenebilmesi için öncelikli olarak sayfada kayıtlı olması; yani Register direktifi ile eklenmesi gerekecektir. Aşağıda Register direktifi ile kullanılabilecek nitelikler ve açıklamaları yer almaktadır.

- Assembly: Eklenecek user control'ün assembly'si. Eğer user control aynı projede ise kullanmaya gerek yoktur.
- Namespace: Eklenecek user control'ün hangi namespace içerisinde bulunduğunu belirler. User control aynı projede ise kullanmaya gerek yoktur.
- Src: User control'ün uygulamada bulunduğu yer ve dosya adı.
- TagName: Kullanılacak user control'ün adı
- TagPrefix: HTML kodları içerisinde user control ekleneceği zaman hangi etiket adı ile çağrılacağı bilgisidir. (TagName ve TagPrefix niteliklerinin kullanımı için aşağıdaki kod örneklerine bakmakta fayda var)

Aşağıdaki Register direktifi ile sayfaya LoginKontrolum adındaki bir user control'ü eklenmiştir. Böylece sayfaya TagName ve TagPrefix bilgileri ile ilgili dosyadaki user control eklenebilir.

<%@ Register Src="Login.ascx" TagName="LoginKontrolum" TagPrefix="myControls" %>

<myControls:LoginKontrolum ID="LoginKontrolum1" runat="server" />


Böylece ASP.NET uygulamalarında kullanabileceğimiz 11 sayfa direktifini detaylı bir şekilde incelemiş olduk. Bir başka makalede görüşmek dileğiyle.


Uğur UMUTLUOĞLU
www.umutluoglu.com
www.nedirtv.com