Bu site emekli olmuştur. Arşiv amaçlı olarak BT AKADEMİ sponsorluğunda yayın hayatına devam etmektedir.




C#nedir?com
 
YAZAR HAKKINDA
Serkan Yazıcıoğlu
Serkan Yazıcıoğlu
http://www.csharpnedir.com/
İletişme geçmek için tıklayın.
5 Makalesi yayınlanmakta.
Yazar hakkında detaylı bilgi için tıklayın.
Yayınlanan diğer makaleleri için tıklayın.
İlgili etiketler: arasinda eventargs ikinci metodu metodun postback redirect request sayfanin sayfaya sender sunucu sunucuya transfer width: ASP.NET Serkan Yazıcıoğlu
 
YAZI HAKKINDA
Türü : Makale
Serbest Köşede C#nedir?com üyelerinin hazırladıkları yazılar yayınlanır. Bu yazılar editör incelemesine girmeden yayınlanır.
Seviyesi : Orta
Kategori : ASP.NET
Yayınlanma Tarihi : 1.10.2007
Okunma Sayısı : 73406
Yorum Sayısı : 2     yorum yaz
Site İçi AramaSİTE İÇİ ARAMA
Üye Girişini AçÜye GİRİŞİ
Üye girişi için tıklayın.
Kullanıcı Adı
Şifre
 
Beni her zaman hatırla
Bir hafta boyunca kullanıcı bilgilerinizi kullanıcı çıkışı yapana kadar hatırlar. (Paylaşılan bilgisayarlarda önerilmez.)
 
Şifremi / Kullanıcı Adımı unuttum.
 
.net TV RSS Serbest KÖŞE (?)
Serbest Köşede C#nedir?com üyelerinin hazırladıkları yazılar yayınlanır. Bu yazılar editör incelemesine girmeden yayınlanır.
emre TAŞ
Silindi
emre TAŞ
yazının devamı >
emre TAŞ
silindi
emre TAŞ
yazının devamı >
emre TAŞ
silindi
emre TAŞ
yazının devamı >
emre TAŞ
silindi
emre TAŞ
yazının devamı >
emre TAŞ
silindi
emre TAŞ
yazının devamı >
Makale Gönder Bende Yazmak İstiyorum
.net TV RSSBlogroll
Turhal Temizer
Conda install environment.yml Package 28.3.2024
Turhal Temizer
Mac OS/X Removing CUDA 28.3.2024
Burak Selim Şenyurt
Kurumsal Yazılımcının Oyun Geliştirme ile İmtihanı 28.3.2024
Burak Selim Şenyurt
Matematik ve Oyun Programlama - Missile Command - Final 28.3.2024
  Diğer Herşey
Sponsorlar
BT Akademi
Medya Portakal
Video Hosting Sponsoru
Csharpnedir.com bir Ineta üyesidir
Uzman Abi
Her Yönüyle C# - Sefer Algan
ASP.NET - Yönlendirme İşlemleri Analizi
 
Kapat
Sayfayı Yazdır Sık Kullanılanlara Ekle Arkadaşıma Gönder MySpace Del.Ico.Us Digg Facebook Google Mixx Reddit StumbleUpon
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
  • Yazılan Yorumlar
  • Yorum Yaz
TEM
7
2008
Ellerine sağlık arkadaşım.
EKİ
10
2007
Makele için teşekkür ederim son derece açıklayıcı olmuş. Ancak server.execute methodu ile ilgili biraz daha örnek verseniz çok iyi olacakmış. Ellerinize sağlık.
Sayfalar : 1 
Yorum yazabilmek için üye girişi yapmalısınız. Üye girişi için tıklayın.
Üye değilseniz Üyel Ol linkine tıklayarak üyeliğinizi hemen başlatabilirisniz.
 
  • Bu Konuda Son 10
  • 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