7. Routing

1. ROUTE YAPISI

Routing dediğimiz şey , en kısa tabiriyle biz web browser’a url’i girdiğimiz zaman hangi controllerin hangi action metodunun çalışcağınının belirlenmesidir.

localhost4354/Controller/ActionMetot

localhost4354/Home/Index    –> Home controllerin action metodu çalışsın.

Peki bu Route ayarları nerede yapılıyor?

Solution -> App_Start -> RouteConfig.cs

Yukarıda routeConfig’in içeriği gözükmekte. İçerisinde RegisterRoutes adında bir metot var ve RouteCollection tipinde routes adında bir parametre alıyor. Fonksiyonun içerisinde bu sınıf nesnesi parametresinin iki metodu kullanılıyor. Birincisi IgnoreRoute , ikincisi MapRoute’dır.

IgnoreRoute : Kabul edilmeyen routeları temsil eder ve onları ignore eder.
MapRoute : Kabul edilen routeları temsil eder.

name : Route ismi.
url :  Rotanın nereye yönleneceği . {controller} gibi yazının etrafındaki süslü parantezler parametrenin değişken olduğunu belirtir. Yani siz urlden Home/Index girdiğinizde, Controller : Home , Action : Index olur veya Home/About yazdığınızda Controller : Home , Action da About olarak yönleni
default : Yukarıdaki değişken urlin default değerini verir.

 routes.MapRoute(
  name: "Default",     
  url: "{controller}/{action}/{id}",
  defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
  );

Buraya kadar Route ayarlarının temel mantığını gördük. Bu route ayarları yukarıdaki gibi tanımlanır ancak bu ayarların geçerli olması için bu metodun biryerden çağırılyor olması gerekir. Mantıken bu route ayarları daha uygulama başlar başlamaz geçerli olması gerektiğinden uygulama açıldığı an ilk çalışan metot olan Application_Start() içerisinde tanımlanmalı.

Application_start() ın konumu 

Solution -> Global.asax -> Application_Start()

 

2. ROUTE İLE İLGİLİ KURALLAR

1. Route yapılandırması aslında bir metodun çalışmasından ibaret olduğundan ve bu metottaki route satırları tek tek incelenip uygun olan ile eşleştirileceğinden route yapıları özelden genele doğru sıralanmalıdır.

2. Urldeki son parametre controllerin actionResultuna arguman olarak gönderilen parametre olacaktır.

    { controller }/{ action }/{ id }  buradaki id controllerin actionResultuna parametre olarak gider.

Home / Action / 1    : “1” ActionResulta parametre olarak gidecektir.

Home / Action / cagatay : “cagatay”  ActionResulta parametre olarak gidecektir.

*Ancak bu son url parametresinin ActionResult tarafından maplenip alınabilmesi için ActionResult’un parametre kısmında da parametre isminin Id olarak tanımlanması lazım.

  ….. ActionResult Action(string Id){ …}

3. Id sayısı artırılabilir. Birden fazla Id URL üzerinden actionResulta gönderilebilir.

routes.MapRoute(

name: “Default”,
url: “{controller}/{action}/{id}/{id2}”,
defaults: new { controller = “Home”, action = “About”, id = UrlParameter.Optional, id2 = UrlParameter.Optional} );

….. ActionResult Action(string Id,string Id2){… }

3. ROUTE AYARLARINDA OYNAMALAR

*Statik URL tanımlama , Solutionda HaberKategori adında bir controller tanımlayın daha sonra içersine de Anasayfa adında bir ActionResult. Route ayarlarını da aşağıdaki gibi yaptığınız takdirde. localhost3242/anasayfa urli sizi HaberKategori controllerinin Anasayfa actionresultına götürecektir.

routes.MapRoute(
 name: "Anasayfa",
 url: "anasayfa",
 defaults: new { controller = "HaberKategori", action = "Anasayfa" }
 );
 routes.MapRoute(
  name: "Default",     
  url: "{controller}/{action}/{id}",
  defaults: new { controller = "Home", action = "About", id = UrlParameter.Optional }
  );

*Eğer ki default route ayarlarını silerseniz, statik dışında bir route girdiğinizde o controller ve actionresult var olmasına rağmen o sayfaya yönlenmeyecektir çünkü sizin girdiğiniz url, route kısmında anlamlandırılmamıştır yani sayfa olarak var olsa da oraya ulaşamazsınız.

routes.MapRoute( 
 name: "Anasayfa",
 url: "anasayfa", 
 defaults: new { controller = "HaberKategori", action = "Anasayfa" } 
);


*Route’ın bir kısmını statik bir kısmını da dinamik tanımlayabiliriz. Örneğin Kategori controlleri altındaki actionResultlara ulaşmak istersek aşağıdaki gibi bir yapı kullanabiliriz.

routes.MapRoute( 
 name: "Anasayfa",
 url: "Kategori/{action}", 
 defaults: new { controller = "HaberKategori", action = "Anasayfa" ,id=UrlParameter.Optional} 
);