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

ASP.NET MVC – Proje, Yönlendirme

Kendi Değişkenlerimiz

Şimdiye kadar MVC’de özel manalar ifade eden controller ve action değişkenleri ile çalıştık. Fakat dilediğimizde kendimiz de değişken tanımlayabiliriz:



		

Bu örneğimizde sayfano isminde bir değişken tanımladık ve varsayılan değer olarak 1 değerini girdik. Daha sonra controller sınıfımız içinde bu değere ulaşmak için iki seçeneğimiz var. İlk olarak RouteData.Values özelliğini kullanacağız.



		

Diğer bir kullanma şekli de action metoda parametre olarak geçirmektir:



		

MVC framework, yukarıdaki action metoddaki parametre isimini yönlendirmede kullandığımız değişken isimleri ile karşılaştıracak ve eşleşme var ise action metoda parametre olarak geçirecektir. Bu yüzden url şablonunda kullandığınız değişken ismi ile parametre isminin aynı olmasına dikkat edin.

Kendi değişkenlerimize varsayılan değer yerine, girilmedikleri taktirde null atamasını da yaptırabiliriz. Bu durumda varsayılan değer olarak UrlParameter.Optional atamalıyız.



		

Eğer urlde sayfano değişkeni girilmemişse sayfano null olacaktır.

Segment Sınırını Kaldırmak

Şimdiye kadar yaptığımız bütün yölendirmeler sabit sayıda segment gerektiriyordu. Mesela son örneğimizde 3 adet segment alıyorduk. Velevki url 4 segmentten oluşursa bu durumda yönlendirmemiz url ile eşleşemiyecek ve 404 hatasını kullanıcıya gösterecektir. Bunun gibi durumlarda fazla girilen segment değerlerini tek bir değişken altında toplayabiliriz. Mesela:



		

Burada belirttiğimiz extra değişkeni sondaki tüm değerleri alacaktır. Mesela:

http://www.diyezon.com/AnaSayfa/Index/2/Segment1/Segment2/Segment3

gibi bir url’yi aşağıdaki gibi ayrıştıracaktır:

controller="AnaSayfa", action="Index", sayfano="1", extra="Segment1/Segment2/Segment3"

Extra değişkeninin sayfano değişkeninden sonra girilen slash karakterleri dahil tüm değerleri barındırdığına dikkat edin. Tabi burada verdiğimiz değişken ismini değiştirebilirsiniz, yani “extra” özel bir mana ifade etmiyor. Sadece değişkenin başına “*” işaretini yerleştirmelisiniz.

Yönlendirmeleri Sınırlandırmak

Her ne kadar tüm olası değerleri url’den almak iyi gibi gözükse de bu gibi durumlar hackerlara davetiye çıkarır. Bu yüzden urlye girilen değerleri belli kıstaslara göre sınırlandırabiliriz. Böylelikle kıstasa uymayan yönlendirmeler eşleştirilmemiş olur.

Kısıtlamaları gerçekleştirirken regular expression değimlerinden faydalanıyoruz. Reg.Exp. başlı başına ayrı bir konudur ve burada bundan bahsetmeye ne zamanımız ne de yerimiz yeterli gelir. Fakat internet üzerinde basit reg.exp değimlerini bulabilirsiniz. Mesela sadece A ile başlayan kelimeler veya email şablonuna uyan kelimeler gibi…



		

MapRoute metodunun üçüncü parametresi olarak girdiğimiz anonim nesne içinde reg.exp. tanımlamalarımızı gerçekleştiriyoruz. Buradaki örnekte sayfano değişkeni ancak sayısal bir değer ile karşılaşırsa url eşleşmesi gerçekleşmiş olacak. Aksi taktirde bu route eşleşmeyecek ve yönlendirme gerçekleşmeyecektir.

Konumuz reg.exp. değil ama işinize yarayacak bir kaç şablonu hazır verelim. Buradaki örnekte olduğu bir değişken sadece sayısal değerler alacaksa @”\d+” gibi girebiliriz. Eğer değişken sadece A harfi le başlasın istersek “^A.*” girebiliriz. Veya değişkenimizin sadece belirli sabit değerler olmasını istiyorsak “^AnaSayfa$|^Makaleler$” gibi girebiliriz. Bu durumda değişkenimiz ancak değeri AnaSayfa veya Makaleler olursa eşleşecektir.

Bunun dışında eğer url’mizi http metoduna göre sınırlandırmak istersek HttpMethodConstraint sınıfını kullanacağız. Mesela sadece POST tipindeki istekler için:



		

yazabiliriz. Bunun dışında, kendiniz reg.exp. kullanmadan da sınırlandırma gerçekleştirebilirsiniz. Ama bu makalemizde bundan bahsetmeyeceğiz. Eğer merakınızı cezbederse IRouteConstraint arayüzüne bir bakın derim. Bu arayüzü kullanarak HttpMethodConstraint tarzı bir sınırlayıcı sınıf yazıp kullanabilirsiniz.

Çakışmaların Önüne Geçmek

Şu url şablonunu ele alalım:

{controller}/{action}

Bir url isteği geldiği vakit yönlendirme sistemi bunu controller ve action değişkenlerine göre ayıracak ve sonrasında MVC kütüphanesi controller değişkeninde bulunan isme göre ilgili controller nesnesini çağıracaktır. Mesela controller değişkeni AnaSayfa ise sistem, AnaSayfaController isminde bir sınıfı arayacaktır. Eğer başka bir AnaSayfaController sınıfı proje içinde başka bir namespace içinde tanımlı ise, sistem bunlardan hangisini kullanacağını bilemez ve hata mesajını ekrana basar. Bu gibi durumlar genelde büyük projelerde ortaya çıkabilmektedir. Bu durumda hangi namespace’in daha öncelikli olduğunu yönlendirme parametrelerinde belirtmemiz gerekmektedir.

İki adet namespace’de yani “WebSites.Controller” ve “Denemeler.Controllers” namespace’lerinde AnaSayfaController isminde aynı ada sahip sınıflarımız olsun. Bu durumda:



		

“WebSites.Controllers” namespace’i daha öncelikli olarak çağrılacaktır. Farkında iseniz bir önceki konuda MapRoute fonksiyonun dördüncü parametresi reg.exp. kısıtlamalarını içerirken bu örnekte bu parametre namespace önceliği için ayrılmıştır. Bu anonim dizi içine öncelikli olacak namespace’leri girebilirsiniz. Eğer “Denemeler.Controllers” alan adını bu dizi içine girersek:



		

yine aynı hatayı alırız. Çünkü bu diziye gireceğiniz alan adları aynı önceliğe sahip olacaktır, dizinin ilk veya son elemanı olması durumu değiştirmeyecektir.

Eğer aranılan Controller nesnesi belirttiğimiz namespace içinde bulunamazsa diğer alan adlarında arama yapılacaktır. Her ne kadar çok gerekmese de eğer istersek arama işlemini sadece belirttiğimiz alan adı ile sınırlandırabiliriz.



		

Bu durumda sadece “WebSites.Controllers” alan adı aranacak ve diğer alan adları aranmayacaktır.

Yönlendirmelerde Öncelikler

Şimdiye kadar sadece bir adet yönlendirme kullandık. Normalde bir sitede bunun gibi bir çok yönlendirme tanımlayacaksınız. Bu durumda hangi yönlendirmenin hangisinden önce olduğunu sistemin bilmesi gerekmektedir.

Yönlendirme işlemlerinde Routes kolleksiyonuna ilk eklenen değer en yüksek önceliklidir, en son eklenen ise en düşük önceliklidir. Yazacağımız yönlendirmeleri bu kurala göre yazmak durumundayız. Mesela aşağıdaki örneği ele alalım:



		

Yönlendirme mekanizması ilk başta ilk eklenen yönlendirmeyi ele alacak. Eğer bir eşleşme olmazsa sonraki yönlendirmeye geçecek. Eğer eşleşme olursa yönlendirme işlemini gerçekleştirecek, yani diğer yönlendirmeleri es geçecek. Bu örneğimiz için http://www.diyezon.com/Eski/Index gibi bir url kullanırsak, sistem ilk baştaki yönlendirme ile bunu eşleştirecek ve controller = Eski ve action = Index olacak. Yani ikinci yönlendirmeyi kontrol etmeyecek bile, çünkü ilk url şablonu ile girdiğimiz url eşleşmiş durumda. Önceden de dediğimiz gibi, yönlendirme sistemi url şablonundaki değişkenlerin değerleri ile ilgilenmez. Onun için her şey segmentlere ayrılmış string ifadelerdir. Bu yüzden yukarıdaki örnekte “EskiMakaleler” controller sınıfı yerine “Eski” controller sınıfı tercih edilecektir. Çünkü ilk yönlendirmede eşleşme sağlanmıştır.

Mevcut Dosyalar ve Yoksayılan Yönlendirmeler

Son olarak bu konuda bahsetmek istediğim nokta mevcut dosyaların pas geçilmesi. Eğer url, dosya sistemindeki istenilen bir dosyayı istiyorsa, bu durumda yönlendirme sistemi öncelik olarak bu dosyaya erişimi verecek ve diğer yönlendirmeleri pas geçecektir. Eğer dosya sistemindeki bir dosyadan önce bizim kurallarımızın işleme tabi tutulmasını istiyorsak:



		

şeklinde RouteExistingFiles özellğini başta true yapmalıyız. Bu durumda Images klasöründe get-image.jpg dosyası olsa dahi öncelik olarak bizim yönelendirme kuralımız çalışacak ve bu örnekteki gibi Image controller nesnesi çalıştırılacaktır.

Tam tersi mantık ile bazı dosyalara erişimde yönlendirme kullanılmamasını ifade edebiliriz:



		

Bu komut ile favicon.ico gibi bir simge dosyası yönlendirmeye tabi tutulmadan direk olarak IIS’den istenecektir. Tabi ki yönlendirme önceliği bu metod için de geçerlidir. Bu metodu js, css, resim gibi statik veri içeren klasörler üzerinde kullanabilirsiniz.

Makale henüz bitmedi. Sonraki sayfaya aşağıdaki linklerden geçebilirsiniz.

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)