Makale Özeti

Bu yazımızda MVC Framework 'te sıklıkla kullanılan Asp.Net Routing yapısını detayları ile incelemeye çalışıyoruz.

Makale

Asp.Net MVC Framework ile uygulamaların en sık kullanılan özelliklerden biridir Asp.Net Routing. Sayfa çağrımlarında ve Controller ile haberleşme esnasında kullanılmaktadır. Proje içerisinde Global.asax dosyasına eklenmektedir. MVC uygulamalarında sayfa istekleri doğrultusunda yapılan işlemler routing temeli göze alınarak gerçekleştirilmektedir.

Asp.Net Route Kullanımı

MVC Framework ile geliştirilmiş olan web projesi şablonunda routing en temelde iki dosyada kullanılmaktadır. Bunlardan birincisi Web.config diğeri ise Global.asax dosyasındadır. Bu dosyalardan yer alan routing yapısı, son kullanıcılar tarafında yapılan istekler doğrultusunda Controller/Action/ID modelini ele alarak işlemesine olanak tanımaktadır.

Birincisi, web.config içerisinde bizlere sunulan dosyaları inceleyeceğiz. Bu bölümde Asp.Net Routing için konfigürasyonu yer almaktadır. Özellikle konfigürasyon dosyasında; system.web.httpModules ile ilgili seçimler, system.web.httpHandlers ile ilgili seçimler, system.webserver.Modules ile ilgili seçimler ve system.webServer.Handlers ile ilgili seçimler yer almaktadır. Config dosyasında yukarıda belirttiğimiz seçimleri silmemiz durumunda uzun zaman boyunca birçok işlem üzerine uğraşmamız gerekecektir. Bu sebepten ötürüdür ki silinmesi kesinlikle önerilmemektedir.

İkincisi ile uygulama içerisindeki Global.asax dosyasının içerisinde route table oluşturulmasıdır. Bu dosyada oluşturulan route yapısı Controller/Action/ID mantığını baz alarak oluşmuştur.

Global.asax
ausing System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Routing;

namespace MvcApplication1
{
     // Note: For instructions on enabling IIS6 or IIS7 classic mode,
     // visit http://go.microsoft.com/?LinkId=9394801

    public class MvcApplication : System.Web.HttpApplication
    {
          public static void RegisterRoutes(RouteCollection routes)
          {
              routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

              routes.MapRoute(
                    "Default",                                                              // Route name
                    "{controller}/{action}/{id}",                                    // URL with parameters
                    new { controller = "Home", action = "Index", id = "" }    // Parameter defaults
              );
          }

          protected void Application_Start()
          {
               RegisterRoutes(RouteTable.Routes);
          }
     }
}

MVC uygulaması ilk başlatıldığında Application_Start() metodu çağırılır. Bu metodu RegisterRoutes() metodunu çağırır. RegisterRoutes() metodunda route table oluşturulmuştur. Kısaca uygulamamız ilk başladığı andan uygulamayı durdurana kadar geçen süreçte sürekli olarak Route Table işlemi gerçekleştirilmektedir.

Varsayılan Route Table isminde “default” geçendir. Bu tek yönlü yönlendirme olarak ta gösterilmektedir. Varsayılan Route Table ilk internet penceremizin adres çubuğuna yazılacak olan url için ilk olarak controller name ‘i alır. Bir sonraki parametre olarak action ‘ı üçüncü ve son parametre olarak da id parametresini almaktadır. Daha önce değindiğimiz MVC yazılarında da görmüş olduğumuz örnekleri de hatırlarsak veri tabanından yararlanarak gösterdiğimiz verilerin detaylarını göstermek istediğimizde ilişkisel olan controller name, bu istek doğrultusunda ne tür bir işlem yapılacağına ilişkin action name gelir. En son olarak ta çağırılan kayda ilişkin id değerinden yararlanarak istediğimiz gerçekleştirmiş olur.

MVC Framework kullanarak geliştirdiğimiz projeleri çalıştırdığımızda ve herhangi bir yere istekte bulunduğumuz adres çubuğuna yazılacak olan url aşağıdakine benzeyecektir.

/Home/Index/3

Yukarıdaki örneğimizi default Route map ‘i göz önüne olarak parçalara ayırırsak;

Controller = Home
Action = Index
Id = 87

Şeklinde olacaktır.

Bu durumda yapılan istek adres çubuğunda URL/Home/Index/3 biçiminde gözükecektir. Peki bu bize programlama konusunda nasıl bir istekte bulunmuştur. En temel mvc mantığını hatırlamak gerekirse, son kullanıcı tarafında yapılan istekler yapılacak iş (action) bazlı olarak gerekli olan controller sınıfına gönderilir. Sınıflarda ilişkili metod bulunarak işlem gerçekleşir ve devam tamamlanır. Bu durumda adres çubuğunda yer alan url home controller sınıfının içerisindeki Index metodunu bulur ve aşağıdaki biçimde işleyebilmesine olanak tanır.

HomeController.Index(87)

Bu işlem sonucunda sayfada 3 nolu kayda ilişkin veriler gösterilir (Tabii bu id sonucunda gerekli değerlerin gelmesi için bir işlem yapılmışsa).

HomeController içerisinde yer alan Index() metodunu incelemek gerekirse; Yapılan istek sonucunda iki türlü istek alabilmemiz mümkündür. Bunlardan birincisi ID alanının boş olması, ikincisi ise parametre almasıdır. Varsayılan olarak parametresiz gelmektedir. Bunun sebebi herhangi bir veri olmadığı durumlarda null tip almayan bir parametre kullanılırsa hata vereceğinden ötürüdür.

Varsayılan Index metodu aşağıdaki gibidir.

Controller\HomeController.cs
using System.Web.Mvc;

namespace MvcApplication1.Controllers
{
    [HandleError]
    public class HomeController : Controller
    {
        public ActionResult Index()
        {
            return View();
        }
    }
}

Yukarıdaki kod parçasında da göreceğiniz üzere Index metodunda bir parametre alınmamıştır. Bu tür kullanımlarda ID istekleri es geçilerek işlem yapılacaktır.

Bir diğer kullanım seçeneği string parametre alarak kullanılmasıdır. Bu da değer gelmeme ihtimali olan durumlar için ideal bir kullanım seçeneğidir. Çünkü string te boş değer alarak işlem yapabilmektedir.

Controller\HomeController.cs
using System.Web.Mvc;

namespace MvcApplication1.Controllers
{
    [HandleError]
    public class HomeController : Controller
    {
        public ActionResult Index(string id)
        {
            return View();
        }
    }
}

Bu tür kullanımlarda ID parametresi boş geçildiği durumlarda String.Empty değerini alır işlemini ona göre devam ettirir. Aksi durumda değer girildiğinde ise girilen değere göre işlem yapar.

Bir diğer kullanım şekli integer bir ID parametresi kullanmaktadır. Integer kullanımını da iki şekilde değerlendirmek gerekiyor. İlk olarak nullable tipteki parametreye göz atalım.

Controller\HomeController.cs
using System.Web.Mvc;

namespace MvcApplication1.Controllers
{
    [HandleError]
    public class HomeController : Controller
    {
        public ActionResult Index(int? id)
        {
            return View();
        }
    }
}

Yine kullanıcı tarafında gelen istekte ID parametresinin boş geçilebilme ihtimalini düşünerek int olan id ‘yi nullable yaptık. Bu durumda eğer ki id parametresi boş gelirse bizden herhangi bir soru sormayacak ve varsayılan sayfaya yönlendirecektir. Aksi durumda ise alınan değere göre işlemi gerçekleştirecek ve bize istediğimiz sonucu sunacaktır.

Değineceğimiz son kullanım şekli integer tip alan bir parametre şekli olacaktır.

Controller\HomeController.cs
using System.Web.Mvc;

namespace MvcApplication1.Controllers
{
    [HandleError]
    public class HomeController : Controller
    {
        public ActionResult Index(int id)
        {
            return View();
        }
    }
}

Bu tür kullanımlarda kullanıcı tarafından yapılan istekler doğrultusunda gerekli ID parametresini uygulama değerlendirerek istediğimiz sonucu verecektir. Fakat olumsuz bir yönü olmaktadır. Eğer ki gönderilen istekte Id parametresi yok ise sorun ile karşı karşıya kalmış bulunuyoruz. MvcAction sınıfı null tipleri kabul etmemektedir. Bu sebepten ötürü de kullanıcılar tarafında id parametresi boş olan bir istek gönderildiğinde uygulamamız hata verecektir. Hata mesajında ise yukarıda da belirttiğimiz gibi “kullandığınız tipin null değer alabilmesi gerekmektedir. Eğer ki bu tipi kullanmaya devam etmek istiyorsanız nullable bir tip kullanınız” şeklinde bir mesaj alacağız.



Genel olarak ilk konumuzu toparlamak gerekirse; MVC şablonu ile geliştirilen projeler sayfa yönlendirme işlemleri Asp.Net Routing ile yaptıklarını, web.config ve Global.asax içerisinde bilgilerinin tutulduğunu ve son olarak ta routing ‘e talepte bulunan metotların alabileceği tipleri incelemeye çalıştık.

Not: Yaptığınız işlemler sonucunda hala parametre almıyor ya da sayfa bulunamadı hatası veriyorsa oluşturduğunuz controller sınıfına ilişkin view ‘ı oluşturarak sorunu çözebilirsiniz.

Herkese mutlu günler diliyorum.

Turhal Temizer
info@turhaltemizer.com
http://turhal.blogspot.com