|
ASP.NET - Yönlendirme İşlemleri Analizi |
|
Gönderiliyor lütfen bekleyin... |
|
|
ASP.NET'te sayfalar arasındaki yönlendirmeler
web sitelerimizin olmazsa olmazlarıdır. Her ne kadar bu navigasyon işlemlerini yapmak
çok zor bir işlem olmasa da bazı incelikleri vardır. ASP.NET, yönlendirme
işlemleri için kullanımımıza 2 adet Link nesnesi ve kontrolü bizim sağlamamız
için de 3 adet metod sunmuştur. Bunlar:
Kontroller
|
HTML Anchor
HyperLink
LinkButton |
Metodlar
|
Response.Redirect()
Server.Transfer()
Server.Execute() |
Makalemizde bu özelliklerin nasıl çalıştığını ve aralarındaki
farkları beraber inceleyelim.
Link kontrolleri
Sayfamızda linkin görünmesi gerektiği anlarda kullanabileceğimiz 3 adet kontrol vardır. Bunlar; Anchor, HyperLink ve
LinkButton'dır. Şimdi bunların html tarafında nasıl kodlandığına bir bakalım:
//HTML Anchor
<a href="Default2.aspx">Default2</a>
//HyperLink
<asp:HyperLink ID="HyperLink1" runat="server"
NavigateUrl="~/Default2.aspx">Default2</asp:HyperLink>
//LinkButton
<asp:LinkButton ID="LinkButton1" runat="server" PostBackUrl="~/Default2.aspx">Default2</asp:LinkButton> |
Peki bu 3 kontrol arasında ne fark var?
Anchor, zaten bilindiği üzere bir HTML nesnesi olup ASP.NET'in üzerinde herhangi
bir etkisi yoktur. Dolayısıyla sunucu taraflı çalışmaz. Sadece tarayıcıya yeni
bir sayfaya gidileceğinin bilgisini verir. Sunucuya gitmediği için de sunucu
kaynaklarını yormaz.
HyperLink ve LinkButton arasında ise kritik bir fark vardır. HyperLink
ile sunucu tarafında kodlarımızı çalıştırabiliriz. Yukarıda dikkatinizi çektiyse HyperLink’te
NavigateUrl, LinkButton'da ise PostBackUrl özelliği bulunmaktadır. PostBackUrl özelliği
ise Cross-Page Postback yöntemini kullanabilmek için yazılmaktadır. İsterseniz Cross-Page
Postback yöntemini bir hatırlayalım:
Sayfalar arası veri taşıma
yöntemlerinden biri olan Cross-Page Postback bir sayfanın tüm içeriğini alıp sunucuya ve
ardından da diğer
sayfaya göndermeye yarar. Yani biz bu özellik yardımıyla herhangi bir
kontrolümüzün içerisindeki veriye diğer sayfadan da ulaşabilmekteyiz.
IButtonControl arayüzünden implemente olmuş nesneler bu özelliği
desteklemektedir (Button, LinkButton, ImageButton). İkinci
sayfaya istek gönderildiğinde PreviousPage özelliği vasıtasıyla sunucuya
gönderilen ilk sayfadaki nesnelerin içindeki verilere ulaşabiliriz. Sonuç
olarak
LinkButton'ın HyperLink'ten fazlası Cross-Page Postback özelliğini
desteklemesidir. Bu özelliğe bir örnek vermek
gerekirse:
protected void Page_Load(object sender, EventArgs e)
{
TextBox tb = (TextBox)PreviousPage.FindControl("TextBox1"); //İlk
sayfada ID'si 'TextBox1' olan nesneye burdan ulaşılır ve cast edilir.
Response.Write(tb.Text.ToString());
} |
Cross-Page Postback özelliğinin kötü yanı ise sayfadaki tüm nesnelerin sunucuya tekrar geri post edilmesidir. Bu da
request süresini uzatmaktadır.
Sonuç olarak bu 3 kontrolü kullanım olarak şöyle ayırabiliriz:
-Anchor: Eğer sunucu tarafında hiç bir kod çalıştırlmayacaksa bu kontrol tercih
edilmelidir. Sunucu kaynaklarını daha az kullanır.
-HyperLink: Eğer sunucu tarafında bazı kodlar çalıştırılacaksa bu kontrol tercih edilmelidir. Sayfanın içeriği sunucuya gönderilmez.
-LinkButton: Eğer sunucu tarafına sayfanın içeriği de gönderilecekse bu kontrol tercih edilmelidir. Sunucuyu en çok meşgul eden kontroldür.
Navigasyon Metodları
Bazı durumlarda yönlendirmenin linkler
altında değilde belirli
koşullar altında yapılması istenebilir.
Bu gibi durumlarda transfer işlemini kontrol edebilmemiz için bize 3 adet metod
sunulmuştur.
-Response.Redirect metodu:
Redirect metodu bu metodlar arasında en popüler olanıdır. Bu metod parametre
olarak aldığı URL adresini, tarayıcıya iletip bu adrese gitmesini sağlar. Bizim
klavyemizden bu adresi girmemizle, Redirect metodunun çalışması arasında
görünürde pek fark yoktur. Fakat arka tarafta işler farklıdır. Tarayıcının
bu adrese ulaşabilmesi için önce sunucuya gitmesi gerekir. Sonrasında sunucudan gelen bu
adresi URL kısmına ekleyerek tekrar yeni bir request yapar ve yeni sayfaya
gider. Dolayısıyla Redirect metodundan önce ve sonra olmak üzere toplamda iki adet
request yapılmakta, bu da düşük performansa sebep olmaktadır. İsterseniz bu
metodun çalışma prensibini bir ilüstrasyonla inceleyelim.
protected void Button1_Click(object sender, EventArgs e)
{
Response.Redirect("default2.aspx");
} |
Butona tıklanmasının ardından tarayıcı ilk talebini gerçekleştirir ve sunucunun kapısını çalar.
Burada sunucu birinci sayfadaki Redirect metodunu çalıştırır ve tarayıcıya "302:ObjectMoved"
HTTP başlığını gönderir. Bu başlığın içinde "Location" tag'i altında tarayıcının
gideceği yeni konum da bulunmaktadır. Tarayıcı bu konumu alıp URL adresini
yerleştirir ve ardından sunucuya ikinci talebini gönderir.
Tarayıcı sunucuya ikinci kez gittiğinde
bu sefer istediği sayfanın HTML çıktısını alır
ve ziyaretçinin kullanımına sunar. Bu metod her ne kadar en hatasız çalışan
metod olsa da 2 request yapması bir dezavantajdır. Dolayısıyla da her zaman doğru tercih değildir.
-Server.Transfer metodu:
Server.Transfer metodu adından da anlaşıldığı üzere sunucu üzerinde çalışmaktadır.
Redirect metoduna göre en büyük farkı sunucu ve tarayıcı arasında iki request yerine tek bir request
yapmasıdır. Redirect metodunun yaptığı ikinci request burada sunucu tarafından kendi
içerisinde yapılmakta dolayısıyla da daha performanslı çalışmaktadır.
Dilerseniz bu metodun nasıl çalıştığına bir şekil üzerinde bakalım.
protected void Button1_Click(object sender, EventArgs e)
{
Server.Transfer("default2.aspx");
} |
Şekilde görüldüğü üzere düğmeye basılıp ilk sayfanın kodları
çalıştırılırken Server.Transfer metoduyla karşılaşan ASP.NET işlem akışını
orada kesip parametre olarak girilen sayfanın HTML çıktısını oluşturmaya başlar. Böylece
Redirect metodundaki, tarayıcıyla
sunucu arasındaki yapılması gereken ilk talebe gerek kalmaz. Fakat burada şöyle bir karışıklık olmaktadır. Button
nesnemiz, birinci sayfadadır
dolayısıyla da basıldığında tarayıcı sunucudan bu sayfanın çıktısını ister. Ama
sunucu Server.Transfer metodunu çalıştırıp ilk sayfanın işlemini orada keser ve ikinci sayfanın HTML çıktısını oluşturup tarayıcıya gönderir. Sonuç
olarak tarayıcı ilk sayfayı çağırır ama kendisine başka bir sayfanın çıktısı
gelir ve bundan da haberi yoktur. Sunucudan aldığı URL ise talep ettiği URL'dir yani ilk sayfanın adresidir.
Burada bir URL sorunu karşımıza çıkmaktadır. İlk Transfer metodumuz çalıştığında
URL adresimiz hiç değişmez. Eğer biz ard arda birden fazla Transfer metodu çalıştırırsak URL kısmında hep
bir önceki sayfanın adresi görünür. Bunun sebebini aşağıdaki çizimde
inceleyelim:
Yukarıda düğmemiz default.aspx sayfasında bulunmakta ve basıldığında Transfer metodunu çalıştırmaktadır.
Tarayıcı bu düğmeye basıldığında default sayfasının çıktısını ister ve sunucudan
onun URL'ini alır.
Aynı şey ikinci Transfer metodunda da
geçerlidir. URL kısmında default2'nin adresi görünürken, defaul3.aspx'in HTML
çıktısı tarayıcıda belirir. Bu bazı yönlerden handikap gibi görünsede özellikle
QuerySting yöntemi kullanıldığı zamanlarda bir güvenlik önlemi oluşturmaktadır.
Fakat gerek derleme zamanında gerekse kullanım açısından karışıklık yaratabilir. Ayrıca sayfa yerimlerine eklendiğinde farklı bir sayfa
kaydedilecektir ki bu da metodumuzun kullanıcı dostu olmadığını gösterir.
-Server.Execute metodu: Bu
metodun çalışma prensibi Transfer metoduyla benzerdir. Tek fark işlem sırasındaki
değişikliktir. Farkı daha da iyi anlayabilmek için bu 3 metodun işlem
sıralarına bir bakalım.
-Redirect metodunun overload versiyonlarında karşınıza endResponse isimli bir özellik çıkacaktır.
Bu özelliğe true atanırsa, metod çalıştırıldıktan sonra akış diğer sayfaya geçecektir, false atanır
ise metottan sonraki kısım da çalıştırılıp daha sonrasında diğer sayfaya geçilecektir.
Default olarak true atanmıştır.
-Transfer metodu çalıştığında işlem direk diğer sayfaya geçer. Kendisinden
sonraki kodlar çalıştırılmaz.
-Execute metodunda ise işler biraz daha karışıktır. Execute metodu çalıştırıldıktan sonra işlem diğer sayfaya geçer.
İkinci sayfadaki işlem bittikten sonra ise tekrar ilk sayfaya döner ve metottan
sonraki kalan kod kısmını tamamlar. Bu metodun nasıl çalıştığını
aşağıdaki şekilde görebilirsiniz:
Buradaki üçüncü talepten dolayı execute
metodundaki HTML çıktısı diğer akrabalarına göre daha farklıdır. Bu metod iki
sayfayı bir arada gösterir. Dilerseniz bir örnekle bu metodun pratikte nasıl
çalıştığına bir bakalım. Üç adet aspx sayfası açıp sayfalara rastgele kontroller
atalım:
Sayfa 1:
Sayfa 2:
Sayfa 3:
Birinci ve ikinci sayfadaki düğmelere de Server.Execute metodlarını atayalım:
//default.aspx.cs
protected void btnSayfa1_Click(object sender, EventArgs e)
{
Server.Execute("default2.aspx");
}
//default2.aspx.cs
protected void btnSayfa2_Click(object sender, EventArgs e)
{
Server.Execute("default3.aspx");
} |
Başlangıçta sayfamız bu durumdadır. Sadece
default.aspx sayfası vardır.
Birinci sayfada düğmeye basıldığında ise
karşımıza bu sonuç çıkar. Göründüğü üzere yukarıda default2.aspx altında ise default.aspx
olmak üzere iki sayfa alt alta gösterilmiştir.
Yukarıdaki "Sayfa2'nin düğmesi" yazılı düğmeye
basıldığında ise aşağıdaki sonuç ortaya çıkmaktadır. Execute metodu hedef
sayfayı önce HTML çıktısına ekleyip daha sonrasında ise ilk sayfayı bu çıktıya
eklemektedir.
Bu metodun sonuçları ilk başta itici gelebilir. Fakat bazı özel durumlarda çok faydalı olabilir. Örnek vermek gerekirse
kullanıcıya bir form doldurttuğumuzu düşünelim. Diğer sayfada bu formdaki verilerin son bir kontrolünü yaptırmak isteyebilirz hatta yanlış girilenleri de söyleyebiliriz.
Böyle bir durumda ilk sayfamızdaki form altta bulunsa kötü mü olur. Üstelik ViewState’in de yardımıyla bu kontroller kullanıcının girdiği şekilde kendisine tekrardan sunulabilecektir.
|
Server metodları, sunucu içinde talep yaptığından dolayı farklı bir sunucudaki adrese gidemezler!
Yani bu metodlarla sadece aynı sunucudaki sayfalar arasında dolaşılabilir. Faklı bir
sunucudaki sayfaya gidilmek istendiğinde Redirect metodu kullanılmalıdır. Ayrıca
bu metodlar sadece ASP.NET sayfaları içindir. HTML gibi aspx olmayan sayfalar için Server
metodları kullanılmaz. |
Server metodlarında QueryString'in taşınması
QueryString ve Form koleksiyonları gibi sunucuya postback olması gereken veriler Server metodları tarafından da taşınabilmektedir.
Fakat Server metodları, Redirect’e göre bu taşımaları biraz farklı yapmaktadırlar. QueryString’i tek bir kez bu metodlara atamak bu veriyi devamlı taşıyacakları anlamına gelir.
Örnek vermek gerekirse biz ard arda birden fazla Transfer metodu çalıştıracağımız zaman sadece ilk sayfada QueryString’i bu metoda bağlamamız kafi olucaktır. Diğer transfer
işlemlerinde sadece URL adresini vermemiz yeterlidir. Bu QueryString’den kurtulmanın
iki yolu vardır. Bunlar ya yeni bir QueryString yazmak ya da preserverForm özelliğine false atamaktır.
preserveForm özelliği kapatıldığı vakit QueryString ve Form koleksiyonu artık postback
olmayacaktır. Bu özellik default olarak true değerini almıştır. Şimdi
Server metodları üzerinde QueryString'in taşınmasını beraber inceleyelim:
//default.aspx.cs
protected void Button1_Click(object sender, EventArgs e)
{
Server.Transfer("default2.aspx?1=bir");
}
//default2.aspx.cs
protected void Button2_Click(object sender, EventArgs e)
{
//QueryString dolu gelir. "bir" değerine ulaşırız.
Server.Transfer("default3.aspx");
}
//default3.aspx.cs
protected void Button3_Click(object sender, EventArgs e)
{
//QueryString yeniden yazılmamasına
rağmen dolu gelir. Gene "bir" değerine ulaşabiliriz.
Server.Transfer("default4.aspx", false);
}
//default4.aspx.cs
protected void Button4_Click(object sender, EventArgs e)
{
//preserveForm özelliğine false atandığı bu sefer hiç
bir değere ulaşamayız.
Server.Transfer("default5.aspx?2=iki", false);
}
//default5.aspx.cs
protected void Button5_Click(object sender, EventArgs e)
{
//Her ne kadar yukarıda preserveForm özelliğine
false atansa da QueryString yeniden yazıldığı için "iki" değerine ulaşabiliriz.
} |
Redirect, Transfer ve Execute metodlarının aralarındaki farkları artık biliyoruz. Şimdi bu metodları
nerelerde kullanabiliriz bir bakalım:
Response.Redirect metodu aspx olmayan sayfalarda ve farklı bir sunucudaki
sayfaya gidilmesi gerektiği anlarda kullanılması gerekir.
Server.Transfer metodu yüksek performans gerektiği anlarda, sunucuya herhangi
bir postback olması durumunda ve hata sayfaları gibi yerimlerine kaydedilmeyecek
sayfalarda kullanılmalıdır. Ayrıca bu metotta hata yönetimi Redirect metoduna
göre daha kolaydır.
Server.Execute metodu ise bir önceki sayfanın kontrollerinin yeni sayfa da görülmesi gerektiği anlarda kullanılmalıdır.
Bu makalemizde sayfalar arasında navigasyon
yöntemlerini incelemeye çalıştık. Umarım bu konular hakkında yardımcı
olabilmişimdir. Herkese iyi günler...
Serkan YAZICIOĞLU
[email protected]
Makale:
ASP.NET - Yönlendirme İşlemleri Analizi ASP.NET Serkan Yazıcıoğlu
|
|
|
-
-
Eklenen Son 10
-
Bu Konuda Geçmiş 10
Bu Konuda Yazılmış Yazılmış 10 Makale Yükleniyor
Son Eklenen 10 Makale Yükleniyor
Bu Konuda Yazılmış Geçmiş Makaleler Yükleniyor
|
|