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

ASP.NET MVC – Proje, Yönlendirme

Geçen haftaki yazımızda ASP.NET MVC’ye giriş yapmıştık. ASP.NET MVC’nin klasik Web Form mantığına göre avantajlarından ve MVC’nin çalışma mantığından bahsetmeye çalıştık. Yine ASP.NET MVC 3 ile birlikte gelen Razor görünüm motorunu da başlangıç düzeyinde bahis konusu yapmıştık. Ardından MVC çalışma mantığının kafamızda somut bir şekilde yer etmesi için bir örnek yapmıştık. Eğer ASP.NET MVC’ye yabancı iseniz ilk başta bu ilk makaleden başlamanızı tavsiye ederim.

Bu yazıda, konuya kaldığımız yerden devam edeceğiz ve ASP.NET MVC projesinin yapısını inceleyeceğiz. Ardından ASP.NET MVC’de çokca kullanılan yönelendirme mantığından bahsedeceğiz. Ki bu konu ASP.NET MVC ‘de ciddi bir proje geliştirebilmemiz için temel konuları kapsıyor.

ASP.NET MVC Projesi

VWD ya da VS’de yeni bir MVC projesi oluşturmaya kalktığınızda IDE size üç şablon(template) seçeneği sunacak. Bunlardan birincisi Empty şablonu, önceki makalede kullandığımız bir şablondu. En basit haliyle bir ASP.NET MVC projesinin barındıracağı dosyalar bu şablonda bulunmaktadır. Diğer şablonlar olan Internet ve Intranet şablonları ise size daha geniş başlangıç noktaları sunmaktadır. Internet şablonu ile varsayılan bir controller ve bir view dosyası projeye dahil edilcektir. Intranet şablonun Internet şablonundan tek farkı ekstradan kullanıcı işlemlerinin olmasıdır. Biz genelde Empty şablonunu kullanmaktayız. Fakat küçük bir takım işler için hazır bu şablonları kullanabilirsiniz. Mesela bu makalede bahsedilecek olan yönlendirmeler üzerinde denemeler yaparken hazır Internet şablonunu kullanabilirsiniz. Tabi ki bu şablonlara ek olarak kendiniz de bir proje şablonu oluşturabilirsiniz. Fakat bu konu makalenin sınırları dışında…

Empty şablonu oluşturduğunuz bir projenin klasör yapısı aşağıdaki gibi olmaktadır:

  • App_Data: Bu MVC’ye özel bir klasör değildir. Veritabanı dosyalarının tutulduğu klasördür. IIS bu dosyaya erişimi kısıtlayacaktır. Kullandığınız host bu klasör altında veritabanı bulundurmanıza izin veriyorsa kullanabilirsiniz.
  • bin: Derlenmiş proje dosyalarıdır. IIS bu klasöre erişim vermediği gibi VS ya da VWD de bu klasörü Solution Explorer’da gizler. Projeyi tamamlayıp hosta taşıyıncaya kadar işiniz olmaz bu klasörle.
  • Content: Bu klasör ismi kabullenmedir ve zorunlu değildir. CSS ve resim gibi statik dosyalarınızı bu klasöre koyabilirsiniz. Fakat zorunlu olmadığı için istediğiniz klasörü de kullanabilirsiniz.
  • Controllers: Controller sınıflarını koyduğumuz klasördür. Bu klasörün ismi de zorunlu değildir. Çünkü sonuçta bunlar derlenip aynı assembly içine girecekler.
  • Models: Model sınıflarını yerleştirdiğimiz klasördür. Bu klasörün ismi de kabullenmedir ve zorunlu değildir. Çünkü sonuçta bu sınıflar derlenip bir assembly oluştururlar ve bin klasörüne yerleştirilirler.
  • Scripts: Bu da Content klasörü gibi zorunlu değildir. Javascript dosyalarını bu klasörde tutabilirsiniz.
  • Views: View ve partial view dosyaları bu klasörde tutulur. Ayrıca bu klasörde bulunan Shared klasörü layout ve tüm controller’lar tarafından kullanılabilecek ortak view dosyalarını tutarlar. Bu klasör IIS tarafından servis edilmez yani erişimi kısıtlanmıştır. Bu klasörün ana dizininde bir web.config dosyası mevcuttur. Bu web.config, uygulamanın web.config dosyasından ayrıdır ve bu klasörün IIS tarafından servis edilmesini engeller. Bu klasörün ismi kabullenme değildir. Fakat MVC’nin yapısını özelleştirerek view dosyalarının başka klasörde aranmasını sağlayabilirsiniz. Tabi bu makalemizin sınırları dışında bir konu…

Bu klasörler dışında ana dizinde uygulamanın bir adet web.config dosyası ve bu makalede kısmen bahsedceğimiz uygulamanın sınıfını içeren Global.asax dosyası mevcuttur. Bunlar dışında ilerideki makalelerde bahsetmek istediğim bir konu olan alanlarla ilgili olan Areas klasörü mevcut olacaktır. Yeni bir alan oluşturduğunuzda VWD bu klasörü otomatik olarak projeye dahil edecektir.

Gördüğünüz gibi çoğu klasör ismi zorunlu değildir ve her nasıl istiyorsanız klasör yapısını o şekilde şekillendirebilirsiniz. Fakat Views klasörü diğerlerinden farklı bir yapıya sahiptir.

İsimlendirme ile ayarlama diyebileceğimiz bu yapı, Ruby on Rails’in bu kadar tutmasının nedenlerinden biridir aslında. Bu yapı sayesinde Controller sınıfları ve View dosyaları arasında ekstra bir ilişkilendirme yapmak zorunda kalmıyorsunuz. İşin güzel tarafı, ilgili Controller sınıfına ait bir View eklemek istiyorsanız, sadece bu Controller sınıfı ile aynı ismi taşıyan bir klasör içine View dosyanızı yerleştirmeniz yeterlidir. Mesela AnaSayfa isimli bir Controller sınıfının Index adlı bir action metodu varsa bu action metoda ait View dosyası, /Views/AnaSayfa/Index.cshtml dosyası olacaktır. Bu varsayılan isimlendirme yapısını isterseniz yeni bir Controller Factory tanımlayarak değiştirebilirsiniz. Bu makalemizin konusu değil, ama illaki incelemek isterseniz DefaultControllerFactory sınıfını ve IControllerFactory arayüzünü inceleyebilirsiniz.

Bu yapı sayesinde göstermek istediğimiz bir View dosyasını action method’dan dönüş yapmamız kafidir. Mesela:



		

ile Index metoduna ait Index.cshtml dosyasını dönderirsiniz. Eğer başka bir view dosyasını sonuç vermek isterseniz:



		

yazmanız kafi gelecektir. Tabi bu son örnekte eğer aynı controller klasöründe bu dosya bulunamazsa Shared klasörüne başvurulacaktır. Ayrıca “.cshtml” uzantısını girmediğimize dikkat edin. İlerideki makalelerde action method’lardan bahsetmek istiyorum. İleride bu konuya daha detaylı bakabiliriz. Şimdilik bu kadarı yeterli.

Yönlendirme (Routing)

Web Form ve PHP benzeri yaklaşımlarda varsayılan olarak bir url bir dosyaya işaret eder. ASP.NET MVC ise varsayılan olarak yönlendirme kullanmaktadır. Yani:

http://www.diyezon.com/index.php?p=365&d=07&m=08&y=2011

url’si yönlendirme kullanılmadığı vakit, sunucu index.php dosyasına erişmeyi deneyecektir. Fakat url yönlendirmesi kullandığınızda bu url:

http://www.diyezon.com/2011/08/07/asp-net-mvc-ve-razora-giris/

gibi bir hal alacaktır. Böylelikle url’den dosya bilgisine erişilemez ve seo’ya ve ziyaretçilerinize daha uygun url’ler üretmiş olursunuz.

MVC kütüphanesi, yönlendirmeye o kadar hakimdir ki, yönlendirmede yaptığınız ufak değişikliler otomatik olarak tüm sisteme uygulanır. Böylelikle url şablonunu değiştirseniz bile tüm sitede tek tek bul değiştir yapmak zorunda kalmazsınız. Üstelik url şablonu çok rahat ve zahmetsiz bir şekilde yapılandırılabilir.

MVC’de url yönlendirmenin iki temel işlevi vardır. Bu yüzden url yönlendirmeyi iki kısımda inceleyeceğiz. İlk kısımda url şablonları oluştururken, ikinci kısımda bunların site genelinde nasıl kullanıldığını göreceğiz.

Gelen URL İstekleri

Gelen url istekleri, ilgili controller ve action methoda iletilirler. Bu yönlendirme işlemi Global.asax dosyasında uygulamanın başlangıcında oluşturulmaktadır. Global.asax ile kastettiğimiz tabiki code-behind dosyası olan Global.asax.cs dosyasıdır. Yönelndirme işlemi Global.asax için şu şekilde tanımlanmıştır:



		

Gördüğünüz gibi web uygulaması başlar başlamaz route yani yönelendirme kayıtlarımızı gerçekleştiriyoruz.

Gelen url isteklerinin hangi controller ve action method’a ait olduğunu belirlemek için url şablonları(url pattern) oluşturmamız gerekiyor. Bunun için tek yapmamız gereken RouteTable sınıfının Routes kolleksiyonuna yeni bir url şablonu tanıtmak olacaktır. Bunu da url şablonu oluşturma yöntemlerinden en pratiği olan MapRoute metodu ile gerçekleştiriyoruz.

URL Şablonları

Yönlendirme sistemi bir çok yönlendirmeden oluşan Routes kolleksiyonu ile çalışır. Bu kolleksiyonda tanımlı olan yönelndirmeler, hangi controller ve action method’un çalıştırılacağını belirler. Tek tek url’lerin nereye yönlendirileceğini belirtmek yerine url şablonlarından(url pattern) faydalanıyoruz. Mesela aşağıdaki url’ye bakalım:

http://www.diyezon.com/Home/Index

Url’deki ilk kısım yani domain kısmı bizi ilgilendirmiyor. Bu yüzden o kısmı gri ile belirttim. Sonrasında ise “/” slash karakteri ile ayrılmış olan iki segment(bölüm) görüyoruz. Birinci segment ile controller’ı ifade ediyoruz, ikinci segment ile çalıştırılacak olan action method’u ifade ediyoruz. Tabi biz bunu farkediyoruz fakat sisteme bunu nasıl tanıtacağız? Bu örnek için şöyle bir url şablonu oluşturmamız kafi gelecektir:

{controller}/{action}

Gördüğünüz gibi iki adet segment tanımladık ve birincisine süslü parantezler ile controller değişkenini, ikinci segment ile de action değişkenini belirttik. Bu değişkenler(controller ve action) MVC yönlendirmede özel bir değere sahiptir. Yani uydurma değillerdir. Daha sonra göreceğimiz gibi url pattern içinde kendi değişkenlerimizi de tanımlayabileceğiz. Fakat isim olarak bu ikisini veremeyiz.

Gerçekte yönlendirme sistemi, bu şablonda bulunan değişkenleri sadece bir string olarak görür. Yani controller değişkenini gerçekte bir MVC controller nesnesi olduğunu bilmez. Zaten yönlendirme sistemi MVC kütüphanesine değil .NET’e bağlı genel bir sistemdir. Fakat bu aşamadan sonra, yani url’miz bir pattern kullanarak ayrıştırıldıktan sonra, MVC controller ve action değişkenlerini alır ve işleme koyar.

Normalde url şablonları ile istediğiniz kadar segment tanımlayabilirsiniz. Fakat bu örneğimizde sınırlı sayıda segment almaktayız. Sadece bu şablon ile tanımlı bir yönlendirme sisteminde aşağıdaki url’lerin aldıkları sonuçlara bakalım:

http://www.diyezon.com/Home/Index         => controller = Home,  action = Index
http://www.diyezon.com/Index/Home         => controller = Index, action = Home
http://www.diyezon.com/Home               => Segment sayısı az, eşleşme sağlanamaz
http://www.diyezon.com/Home/Index/Module  => Segment sayısı fazla, eşleşme sağlanamaz

Son iki örnekte eşleşme sağlanamadığından, sadece bir url şablonumuz olduğundan, kullanıcıya hata verilecektir. Önceden de dediğim gibi yönlendirme sistemi değişkenlerin içeriği ve varlığı ile ilgilenmez. Yani ikinci örnekte olduğu gibi Index isimli bir controller olmasa dahi bu yönlendirmeyi gerçekleştirir. Bu yüzden eğer segment sayısı tutuyorsa, url ne olursa olsun yönlendirmede eşleşme sağlanmış demektir.

Bu url şablonunu Global.asax dosyasında aşağıdaki gibi tanımlıyoruz:



		

MapRoute metoduna girilen ilk parametre bu yönlendirmeye vereceğimiz isim, ikinci parametre ise url pattern olmaktadır. Yönlendirmelere isim vermeye şimdilik ihtiyacımız yok. Sonraki bölümlerde isimlendirilmiş yönelndirmeleri de kullanacağız.

Varsayılan Değerler

Girdiğimiz url segmentlerinden istediklerimize varsayılan değer atayabiliriz. Böylece o segmentin url’de belirtilmesi zorunluluğunu kaldırmış oluruz. Mesela sitemizin ana sayfası için AnaSayfa controller sınıfını ve action method olarak Index kullanalım. Varsayılan değer kullanmazsak, sitemize girilmesi için illaki http://www.diyezon.com/AnaSayfa/Index girilmesi gerekirdi ki bu güzel bir sonuç değildir. Bu gibi durumlarda segment değişkenlerine girilmedikleri yani null oldukları vakit varsayılan değer belirleyebiliriz.



		

Yukarıdaki oluşturduğumuz route ile action girmez isek yani http://www.diyezon.com/AnaSayfa gibi bir şey girersek, action değişkeni varsayılan olarak Index olacaktır. Aynı şeyi controller değişkeni için de yapabilirsiniz:



		

Bu durumda http://www.diyezon.com şeklinde bir url girdiğimizde AnaSayfa controller sınıfındaki Index action metodu çalıştırılacaktır.

URL Sabit Değerleri

Bir url şablonuna sabit değerler ekleyebilirsiniz. Mesela:



		

Bu pattern ancak “http://www.diyezon.com/eski-makaleler/” ile başlayan urller ile eşleşecektir. Sabit değerleri illaki bir segmente girmeniz gerekmez. Dilerseniz bir değişken ile bitişik bir şekilde kullanabilirsiniz:



		

Bu tanımlama ile http://www.diyezon.com/EskiAnaSayfa şeklinde girdiğimiz bir url’de controller değişkeni yine AnaSayfa olacaktır, EskiAnaSayfa değil!

Yine başka bir yaklaşım ile sabit değerler ve varsayılan değerler ile bir karışım yapabilirsiniz:



		

Bu durumda http://www.diyezon.com/Eski/Goster gibi bir url’de controller değişkeni yine AnaSayfa olacak ve action ise Goster olacaktır.

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)