> ASP.NET | MVC > ASP.NET MVC – Proje, Yönlendirme

ASP.NET MVC – Proje, Yönlendirme

Giden(Üretilen) URL’ler

Şimdiye kadar öğrendiklerimizle çok büyük siteler için bile url şablonları hazırlayabiliriz. Url yönelndirmenin en güzel tarafı, giden yani üretilen url’ler için ek bir çaba sarf etmememizdir. Yani ilk başta url şablonlarını hazırlayıp MapRoute metodu ile sisteme tanıtıyoruz ve üretilen url’ler bu şablonlara uygun oluyor.

Url şablonları url üretmek için bir avantaj olması ile birlikte bu avantajı kullanabilmek için statik url kullanımı yerine url üretimini tercih etmeliyiz. Yani aşağıdaki gibi link oluşturmaktan şiddetle kaçınmalıyız:



		

Çünkü bu tarz statik linkler oluşturduğumuzda, her url şablonunun değişiminde bu tarz url’leri el ile değiştirmek zorunda kalırsınız. Ya da Home controller’ın route ismini değiştirdiğinizde yine bu linki el ile değiştirmeniz gerekir. Tek bir link için el ile değiştirmek belki basittir, fakat sitede binlerce link olduğunu farz edin. Bu yüzden url üretimi önemli bir noktadır.

Aşağıdaki url şablonunu ele alalım:



		

Basit bir html linki oluşturmak için Html.ActionLink yardımcı metodunu çağırıyoruz. View dosyası içinde herhangi bir yerde:



		

yazdığımızda html çıktısı şöyle olacaktır:



		

Velevki url şablonunu şu şekilde değiştirmek istedik:

"AnaSayfa/View{action}"

Bu durumda Html.ActionLink metodunda herhangi bir değişiklik yapmamıza gerek kalmaz. Çünkü url şablonu değiştiğinde Html.ActionLink ve benzeri yardımcı metodlar geçerli olan url şablonuna göre html çıktısı üretecektir. Yukarıdaki url şablonu için html çıktısı şöyle olacaktır:



		

Gelen url isteklerinde olduğu gibi url üretiminde de url şablonlarından kriterimize uygun ilk şablon kullanılacaktır. Yani en uygun şablonu bulmak yerine kriterimize uygun ilk şablon url üretiminde kullanılacaktır. Bu nedenle çok özel url şablonlarınızı en başta tanımlamalısınız. Eğer url üretiminde herhangi bir eşleşen şablona rastlanmazsa ActionLink metodu ile üretilen linkin href özelliği boş olacaktır.

Bu örnekte ActionLink ile view dosyasına bağlı olan controller nesnesinden bir action linki tasarladık. Başka bir controller nesnesinden bir action metod’a link vermek istediğimizde bir parametre daha eklememiz gerekmektedir:



		

Bu örnekte Contact controller sınıfdaki Index metodu için link üretilecektir.

Bununla birlikte sistem, üretmek istediğiniz url’nin varsayılan değerlerini de url üretimine dahil etmeyecek kadar akıllıdır. Yani:



		

şeklinde varsayılan değerleri isteyen bir url üretmek istediğimizde varsayılan değerler atılarak sonuç en kısa haliyle bize sunulur yani:



		

Segment Parametrelerini Belirlemek

ActionLink metoduna girdiğimiz parametrelerin url şablonunda controller ve action değişkenlerine karşılık geldiğini biliyoruz. Bunun dışında tanımladığımız diğer url değişkenleri için de parametre belirleyebilirsiniz. Bunun için metoda bir parametre daha ekleyeceğiz.



		

Bu kodun çıktısı şu şekilde olacaktır:



		

Daha önceden tanımladığımız url şablonundaki “id” isimli değişkene burada “UserId” gibi bir değer atıyoruz. Eğer url şablonunda olmayan fazladan bir parametre atarsak, bu parametre query string olarak url’ye eklenecektir. Yani:



		

Bu kodun çıktısı şu şekilde olacaktır:



		

Gördüğünüz gibi extra değişkeni url şablonunda bulunmuyor, fakat istediğimiz url, url şablonumuza uyuyor. Bu durumda bu şablon kullanılarak sonuna extra değişkeni ile bir query string oluşturuluyor.

Url Üretim Sistemi

Yönelendirme sistemini daha etkin bir şekilde kullanmak istiyorsak, url’lerin üretimi ardındaki mantığı iyi kavramamız gerekmektedir. Üretilecek olan url’miz ile eşleşecek olan yönlendirme bulunurken, sistem url şablonlarındaki segment isimleri ile bizim girdiğimiz parametre isimlerini karşılaştırır. Bununla birlikte her yönlendirmede kullanılan kısıtlamalar da bu eşleşmenin gerçekleşip gerçekleşmeyeceği noktasında söz sahibidirler.

ActionLink gibi bir metodun parametreleri ile url şablonundaki segment isimleri karşılaştırılırken, yönlendirme sistemi ilk olarak mevcut gelen isteğe bakar. Yani ActionLink gibi bir metod ile url üretmeye kalktığımızda sistem, segmentlerden önce, ilk olarak mevcut url isteğini hesaba katar. Şu şablona bir göz atalım:



		

Bu yönlendirme etkin iken kullanıcı “http://www.diyezon.com/Home/Index/SiyahTema/5” url’sini istedi. Yönlendirme sistemi de haliyle bu yönlendirme sistemini gerçekleştirdi ve ilgili action metodu çalıştırdı. Tabi bu url ile beraber tema değişkeni SiyahTema değerini sayfano ise 5 değerini aldı.

Şimdi halen bu url ile istenen sayfada olduğumuzu düşünelim. View dosyamızda aşağıdaki gibi bir link oluşturuyoruz:



		

İlk aklımıza gelen şey, “tema” değişkenini belirtmediğimizden bu metodun yönlendirme sisteminde bir karşılığı olmadığı olacaktır. Çünkü önceden de bahsettiğimiz gibi url üretiminde segment isimleri ile parametreler eşleşmelidir. Fakat biz burada tema değişkenini belirtmedik, bu yüzden ilk akla gelen şey eşleşmenin sağlanamayacağı ve üretilecek olan linkin boş olacağı yönündedir. Fakat bu sayfayı ziyaret ettiğimizde üretilen linkin aşağıdaki gibi olacağını görürüz:



		

Gördüğünüz gibi tema değişkenini belirtmediğimiz halde yönlendirme sistemi ilk başta belirttiğimiz url şablonu ile eşleşme sağladı ve linki üretmeyi başardı. Bunun sebebi, mevcut url ile beraber önceden tema değişkenine SiyahTema atanmış olmasıdır. Yani kullanıcı “…/SiyahTema/5” şeklinde url istemesiyle, bizim tema değişkenimiz SiyahTema olacaktır. Yönlendirme sisteminin tek yaptığı, belirtilmese dahi, bu değeri tekrar kullanmak olacaktır.

Fakat acele etmeyin. Şimdi başka bir şey deneyelim. Diyelim ki yine “…../SiyahTema/5” url adresindeyiz. Ve yine aşağıdaki gibi bir url üretmeye çalışıyoruz:



		

Bu kez sayfano değişkeni yerine tema değişkenini belirttik ve sayfano değişkenini göz ardı ettik. Bu durumda düşündüğümüzün aksine önceki belirttiğimiz tekrar kullanım olayı gerçekleşmeyecek, url eşleşmesi olmayacaktır ve üretilen url boş olacaktır. Çünkü yönlendirme sistemi sadece önceki segment değerleri için tekrar kullanımı devreye sokacaktır.

Her ne kadar tekrar kullanım özelliği önceki segment değerlerini girmemenizi sağlasa da bu özelliği fazla kullanmamanızı tavsiye ediyorum. Çünkü kodlara tekrar dönüp baktığınızda linkin nereye verildiğinin anlaşlıması zor olabilir. Ayrıca son örnekteki gibi hatalar da gerçekleşebilir. Siz en iyisi tüm segment parametrelerini belirtin.

Html Özelliklerini Belirlemek

Sonuçta çıktı olarak html üretiyoruz. Bu yüzden yeri geldiğinde bu linkin html özelliklerini de belirtmemiz gerekbilir.



		



		

Gördüğünüz gibi ek segment parametrelerini null belirttik yani parametre girmedik. Sonraki parametrede ise yine bir anonim nesne oluşturduk ve içinde “a” html tag’ına ait özellikleri belirttik. “class” ifadesi, c#’da ayrılmış bir kelime olduğu için başına “@” işareti koyduk.

ActionLink metodunun bunlar dışında  başka overload versiyonları da vardır. Mesela üretilen url’nin domain kısmını belirtebilir ya da http yerine https ekleyebilirsiniz.



		



		

Burada ActionLink metoduna ait tüm overload versiyonları incelememiz biraz zor. Geri kalanını intellisense yardımı ile çözebilirsiniz.

Link Yerine Url Üretmek

ActionLink metodu ile bir html linki oluşturuyorduk. Eğer sadece url’yi üretmek istersek Url.Action metodunu kullanmalıyız:



		

Bu kodların html çıktısı:



		

olacaktır.

Parametreler ActionLink ile aynı olduğundan burada tekrar bahsetmeyeceğiz.

İsimlendirilmiş Yönlendirmeler

Şimdiye kadar hazırladığımız tüm yönlendirmelere isim olarak null girdik. Fakat özel bazı yönlendirmelere isim atayarak url üretiminde sadece o yönlendirmenin kullanılmasını talep edebiliriz.

İsimlendirilmiş yönlendirmeleri kullanmak için Html.RouteLink ve Url.RouteUrl yardımcı metodlarını kullanabiliriz. Tahmin edeceğiniz gibi Html.RouteLink ile bir html linki, UrlRouteUrl ile bir url stringi üretiyoruz.



		

Bu yönlendirmemize “TemaRoute” ismini verdik. Ve sadece bu yönlendirmeyi kullanmak istersek şu şekilde yazıyoruz:



		

Bu metodların ActionLink ve Url.Action metodlarından farkı, controller ve action değişkenlerini ayrı olarak anonim nesne içinde belirtmemizdir.

İsimlendirilmiş yönlendirmeler her ne kadar cazip bir özellik gibi görünse de tavsiye edilmeyen bir şeydir. Çünkü mevcut yönelendirme sisteminin “ilk yönlendirme en yüksek önceliklidir” kuralını kırmış olabilirsiniz. Bu durumda kullanıcı ürettiğiniz linke tıkladığında hiç ummadığı bir sayfa ile karşılaşabilir. Url yönlendirme sisteminizdeki hataları düzeltmek için isimlendirilmiş yönlendirmelere baş vurmayınız. Bunun yerine url şablonlarınızı bir daha elden geçirip daha uygun bir öncellik sıralaması oluşturun.

 

Bu haftalık da bu kadar. Yorumlarınızı bekliyorum. Klavyenize zeval gelmesin 🙂

Fatih Tolga Ata © 2011

 

Sayfalar: 1 2 3

» Tags: , , ,

13 Comments

  • At 2011.08.14 16:33, Fatih Tolga Ata said:

    Üff baya uzun olmuş. Kendim kaptırıp yazmaya başlayınca ne kadar yazdığımın farkına varmayabiliyorum 🙂 Umarım faydalı olmuştur.

    • At 2011.08.14 18:01, Erdem said:

      Eline sağlık. ilgilenenlere arkadaşlara çok faydalı olacağını tahmin ediyorum. Flartoolkit ve PV3D için de makaleler bekliyoruz bu arada… 🙂

      • At 2011.08.14 18:06, Fatih Tolga Ata said:

        Rüyanda görürsün 🙂

        • At 2011.08.17 13:55, DB said:

          Bizim de yapmanı beklediğimiz bazı şeyler var ama gecikmeye devam ediyor sanırım 😀

      • At 2011.08.21 23:33, elif doğanay said:

        Güzel bir makale elinize sağlık. Klasik yönlendirme asp.net de ki gibi.

        • At 2011.08.22 01:39, selim er said:

          Çok teşekkürler..

          • At 2011.09.01 15:17, arif emre said:

            maşallah döktürmüşsün gene… bunların çıktısını alıp askerde okumayı düşünüyorum 🙂 hemde bir kaç defa… sana zahmet mvc hakkında yazmaya devam et çarşı izinlerine gelince bunları çıktıp alıp bölükte boş vakitlerde okuyayım…

            • At 2011.09.09 21:32, Hersoy said:

              teşekkrür ederim

              • At 2011.09.11 01:57, Ali KARAKUŞ said:

                Ellerinize sağlık.

                • At 2011.12.12 22:07, selim er said:

                  Çok çok teşekkür ediyorum..

                  • At 2012.08.29 15:27, Kaan akdağ said:

                    Bu işlere yeni adım atmış biri olarak söylüyorum; hocam süpersin…. Hem açıklama hem örnekleme birde devamını getirmişsin çok saol…

                    • At 2013.08.16 10:17, Masallah Ozen said:

                      Ellerinize sağlık…

                      • At 2015.09.09 17:07, Volkan Şenkardeşler said:

                        Abi bunların devamını bekliyoruz 🙂
                        Rabbimiz her daim işlerinizi kolaylaştırsın.
                        Selamlar.

                        (Required)
                        (Required, will not be published)