ASP.NET MVC Serisi 2 – Routing

Asp.Net  Şubat 27, 2015

Her ne kadar da yeni başlayanları göz önüne alarak yazmaya çalışsam da Web Forms ile sürekli bir kıyaslama içerisine düşüyorum. Sanırım bu yazı dizisi yeni başlayanlar kadar Web Forms’dan geçiş yapacak arkadaşlar için de faydalı olacaktır.

Controller daha önceki yazımda da bahsettiğim gibi Model ve View arasında köprü görevi görmektedir. Ancak biraz daha fazlası söz konusu. Mesela Web Forms veya PHP geliştiriciliği ile ilgilendiyseniz fiziksel bir dosyayı çağırmaya çalışmaktadır. Ancak Controller yapısında fiziksel bir dosya değil Routing üzerinde bir url ile eşleşme kurularak Controller sınıfımız ve içeriğinde ki bir fonksiyon çağrılır.

Routing Kavramı

Alışıla gelmiş bir şekilde sitede bir uzantı olması sıklıkla karşılaştığımız bir husustur. Örneğin .asp, .php .htm gibi. Ancak bazen bir klasör yapısı gibi alt alta detaylanan adres görebilirsiniz. Bu eğer 2 3 sayfadan ibaret bir html site değilse ya PHP yada ASP.Net gibi Routing yapabilen bir yazılımın eseridir. Örneğin www.site.com/kurumsal/vizyon adresini irdeleyelim. Bu kurumsal klasörü altında vizyon klasörü gibi görünse de aslında bir routing parametresidir. Muhtemelen kurumsal için bir Controller sınıfı ve vizyon içinde bu sınıf içerisinde tanımlanmış bir fonksiyon bulunmaktadır. Bu fonksiyon sınıf bazında veya kendi içinde tanımlanmış bir Model nesnesine erişerek vizyonla ilgili veriyi talep eder. Talebin ardından aldığı veriyi göstermesi gereken View’e göndererek işlevini tamamlamış olur.

Routing oluşturmak direk bir kelime öbeği ile bir Controller ve Fonksiyona eşleştirme yapılabileceği gibi birden fazla kelime aynı controlleri ve/veya fonksiyonu çağırabilecek şekilde yapılandırılabilir. Örneğin içerik gösteren bir Controller için kurumsal ve duyuru şeklinde iki başvuruyu eşleştirdik. Bu durumda www.site.com/kurumsal/ ile www.site.com/duyuru/ adres yapıları aynı Controlleri ateşleyecektir. Tabi bundan sonra hangi fonksiyonları çağıracağı mesele. Bir önceki örnekte bahsettiğimiz gibi adresin sonuna vizyon eklendiğinde vizyon adında bir fonksiyon da çağrılacağı gibi detay adında bir fonksiyona vizyon parametre olarak gidebilir. Bu durumda farklı adres şekilleri aynı Controller ve Fonksiyonları kullanma şansına kavuşabilir.

Routing yokken ne oluyordu?

Basitçe anlatmak gerekirse aslında bu yeni bir icad değil. Global.asax dosyamızın içerisine girip on request eventini modifiye ederek bu işi yapabiliriz. on request her gelen başvuruyu alıp işleyerek bir sonraki aşama olan sayfa katmanlarına aktarmaktadır. Tabi Global.asax da bu event tanımlı değilse pas geçilir ve direk bir sayfa çağrılmaya çalışılır. Ancak global.asax dosyamıza şu satırı eklersek,

Response.Write( Request.Url.Segments[Request.Url.Segments.Count()] );
Response.End();

sonuçta hiç bir sayfa çağrılmadan adres çubuğuna yazdığımız url nin son ‘/’ dan sonra ki metni response teslim ederek ekrana gönderir. Bu aşamadan sonra response end yaparak iletişimi sonuçlandırır. Tabi bu bizim yaptığımız iş çok basitçe, biraz daha controller yapmaya çalışmak için bir kaç class oluşturup segment bilgisinden gelen yazıya göre bu classlardan istediğimizi seçip onlardan gelecek html kodlarını response yazdırmak bu işlemi temelde açıklayacaktır.

Routing yapısı MVC nin çalışması adına başlangıç noktasını oluşturur. Yani Controllerin çalışması için routing sisteminin olması gerekir. Bu aşamada olayın tanımı için nesneleri sıralarsak şu liste ortaya çıkar

  1. Routing HTTP Modülü
  2. ASP.NET MVC HTTP Handler Modülü
  3. Controller Factory (Dinamik olarak Controller nesnelerini oluşturup çağırır)
  4. Controller

Bu sıralamada ilk olarak routing işleminin asp.net tarafından yakalanıp yakalanmaması gerektiğine bakılır. Örneğin sunucuda .php uzantılı dosyalarda barındırmak isteyebilirsiniz. Asp.Net tarafından yakalanması gereken istekler MVC handlere teslim edilerek işleme devam edilir. MVC Handler gelen isteği değerlendirip Controller Factory’den Controller oluşturmasını ister. Sonuç olarak Controller oluşturulup istek işlenerek geriye dönecek HTML responsa teslim edilecektir.

URL şeması ve routing

Hemen bir şema ile yola çıkalım.

/Kurumsal/Vizyon

Yukarıda gördüğünüz adres aşağıda ki şemalarla eşleşir.

/{Controller}/{Action}
/Kurumsal/{Action}
/{Controller}/Vizyon
/Kurumsal/Vizyon

Bu şemalara bakacak olursak ilk şema Kurumsal adında bir Controller olduğunu ve Vizyon adında bir ActionResult döndüren fonksiyonu çağıracaktır. Tabi yok ise hata verecektir 🙂 Tabi bu durumda biri url segmentlerine /Kisisel/Misyon yazar ise Kisisel Controlleri ve Misyon fonksiyonu çağrılmaya çalışılacaktır. Haliyle bu gelişi güzel çağrı bir hataya yol açabilir. Süslü parantezler içinde ki Controller ve Action kelimelerini haliyle fark etmişsinizdir. Bu manada ne olduklarını uzunca anlatmama gerek yok ama yinede kısaca üzerinden geçeyim. {Controller} yazmak girilecek parametrenin aynı zamanda Controller sınıfını adıyla aynı olduğunu belirtir. {Action} ise url den girilen değerin ilgili Controller de aynı isimle bir fonksiyonu çağırmaya çalışacağı anlamına gelir. Gelelim ikinci hususa. Burada Kurumsal zaten sabit yani /Kisisel/ şeklinde segmenti başlayan bir adres bu routinge dahil olmayacaktır. Üçüncü husus ise Kisisel için doğru olacağı gibi Misyon olan ikinci parametreyi kabul etmeyecektir. Yine en son şablon ise direk eşleşmeyi göstermektedir. Peki süslü parantezler içinde Controller ve Action ları belirledik te sabit olanlarda hangi Controller ve Action gelecek diye düşünebilirsiniz. Örneklerimizde daha detaylı anlacağım ama bilmeniz gereken husus şu, bu şablonları verirken varsayılan olarak bir controller adı ve bir de action adı vermeniz gerek. Yani controller ve action süslü parantezler sayesinde parametrik olarak gelmemiş ise sizin varsayılan olarak belirlediğiniz controller ve/veya action çağrılır.

Bu yazımda routing olayını anlatmaya çalıştım. Daha sonraki örneklerde olayı detaylandırana dek esenlikle kalın…

Bu yazı 4066 defa görüntülendi

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

This site uses Akismet to reduce spam. Learn how your comment data is processed.

Yazar Hakkında

15 yıllık çalışma hayatında birçok proje geliştirmiş binlerce projeyi inceleme fırsatı bulmuş yazılım aşığıdır. İşini hobi olarak gören yazarımız iş hayatını profesyonelce zevkle sürdürmektedir.

Son Eklenenler