SelamünAleyküm bu yazıda Routin yapılanmasını inceleyeceğiz genel olarak Routing nedir, Varsayılan Route Yapısı, Özel Route Yapısı ve Route Data başlaklıkları incelemiş olacağız.
Routing, uygulamamıza gelen isteğin hangi Controller ile hangi Action metoduna düşmesi gerektiğini gösteren yapılardır. Uygulamamızın yol haritası da diyebiliriz. Uygulamamız, Route yapısındaki yol haritasında var olan Controller ve Action metotları ile yolunu bulacak ve sayfamıza getirecektir.
Misalen bir haber sitesine istekte bulunduk. Bu isteğin Url'si www.newstest.com/news/detail/845 olsun. Bu gelen Url'nin hangi Controller'e düşüp burada hangi Action matodunu çalıştıracağını Route yapısı karar verir.
Not: | Route yapılandırmasını ayarlarken en çok dikkat etmemiz gereken nokta, projeye eklediğimiz Route yapılarının sırasıdır. Çünkü uygulama ilk uygun gördüğü Route'ye girip bu Route'de yazan Controller ve Action metoduna göre eşlem yapacaktır. Bizim girmesini istediğimiz Route yapısı aşağılarda kalıyorsa bir önem teşkil etmeyecektir. |
Varsayılan olarak Route yapılandırmasında { controller ismi }/{ Action ismi }/{ id? (opsiyonel) } olacak şeklindedir.
Misalen, HomeController ve NewsController isminde iki Controller'imiz olsun.
Bu Controller'lerin Action metodlarında dönen değerleri Controller ismini, Action ismini ve dışarıdan aldığımız parametreyi ekrana Json olarak bastıracak şekilde ayarlayalım.
HomeController'e ait Index isminde Action metodu olsun.
public class HomeController : Controller
{
public IActionResult Index()
{
return Json(new {ControllerName = "Home", ActionName = "Index", RouteParameter = new List<int>() });
}
}
NewsController'e ait Detail ve List isminde iki Action metodu olsun. aynı zamanda Detail metodu id parametresi alsın.
public class NewsController : Controller
{
public IActionResult List()
{
return Json(new { Controller = "News", ActionName = "List", RouteParameter = new List<int>() });
}
public IActionResult Detail(int id = 0)
{
return Json(new { ControllerName = "News", ActionName = "Detail", RouteParameter = new List<int>() {id} });
}
}
Şimdi de Startup class'ımızda bulunan Configure metoduna Default Route ekleyelim.
public void Configure(IAplicaitonBuilder app)
{
//bir hata durumunda ekrana hatayı göstermesi için yazılmış middmeware
app.UseDeveloperExceptionPage();
//varsayılan Route
app.UseEndpoints(routes =>
{
routes.MapControllerRoute(
name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}");
});
}
Eklediğimiz Route yapısnda da görüldüğü gibi Template'ye Controller olarak varsayılan Home'u ekledik. Varsayılan Action metodu olarak da Index Aciton metodunu ekledik. Böylece Url'ye hiçbir şey yazmadığımız durumlarda HomeController'in altındaki Index metodumuzu çağıracaktır.
https://localhost:44563/
{
controllerName: "Home",
actionName: "Index",
routeParameter: [ ]
}
Route'mizde varsayılan olarak Controller ismini Home, Action ismini Index olarak belirttiğimizden dolayı HomeController altındaki Index metoduna gitmiş oldu.
https://localhost:44563/home/index
{
controllerName: "Home",
actionName: "Index",
routeParameter: [ ]
}
https://localhost:44563/news/list
{
controllerName: "News",
actionName: "List",
routeParameter: [ ]
}
Şimdi de parametre göstererek deneyelim.
https://localhost:44563/news/detail/56
{
controllerName: "News",
actionName: "Detail",
routeParameter: [
56
]
}
Varsayılan Route yapısına uymayan bir Url ile istek geldiğinde uygulamamız 404 dönecektir. https://localhost:44563/home/detail --> Bu Url ile istekte bulunduğumuz HomeController altında Detail isminde bir Action metodumuz olmadığından uygulamamız 404 dönecektir.
Görüleceği üzere Url'den yaptığımız isteğe göre uygulamamız bir rota belirledi ve bu rotaya göre Controller altındaki Action metodlarını kullandı.
Şimdi de varsayılan Route'mizi tek satır halinde Configure metodumuza yazalım.
public void Configure(IAplicationBuilder app)
{
//bir hata durumunda ekrana hatayı göstermesi için yazılmış Middleware
app.UseDeveloperExceptionPage();
//varsayılan Route
app.MapDefaultControllerRoute();();
}
Yukarıdaki kodda da görüleceği üzere uzun uzun yazmak yerine uygulamamıza DefaultRoute kullanması için app.MapDefaultControllerRoute(); komutunu kullandık. Yukarıda yaptıığımız istekleri tekrardan yaptığımızda aynı sonucu verecektir.
Sayfalarımız için özel Route'ler oluşturulabilir; bu sayfalara, istekte bulunduğumuz Url yapısına ulaşabiliriz.
Misalen, bir önceki örnekte oluşturduğumuz Controller ile Action metodu aynı kalsın. Ekstradan Weather isimli bir Controller olsun. İçinde de Index Action metodu olsun. Geriye; Controller ismini, Action isimini Json olarak döndürsün.
public IActionResult Index()
{
return Json(new { controllerName = "Weather", actionName = "Index" });
}
//Configure metoduna eklemek istediğimiz Route'ları yazalım.
public void Configure(IApplicationBuilder app)
{
//Bir hata durumunda hatayı göstermesi için yazılmış Middleware
app.UseDeveloperExceptionPage();
#region route
app.UseEndpoints(rouets =>
{
routes.MapControllerRoute(
name: "NewList",
pattern: "haberlistesi/{Controller}/{Action}",
defaults: new { controller = "News", action = "List" });
routes.MapControllerRoute(
name: "havadurumu",
pattern: "hava-durumu",
defaults: new { controller = "Weather", action = "Index" });
routes.MapControllerRoute(
name: "default",
defaults: "{controller=Home}/{actian=Index}/{id?}");
});
#endregion
}
Configure metoduna haber listesi için bir Route, hava durumu için bir Route ve bir de varsayılan Route'mizi tanımladık.
Not: | Route'lere verilen name alanları aynı olmamalı. Çünkü aynı olması durumunda uygulamamız hata verecektir. |
NewList isimli Route satatik bir url ("haberlistesi...") ile başlayıp Controller ve Action isimleriyle devam edecek. En altta varsayılan Route olduğundan dolayı sadece Controller ve Action isimleri ile başlayan Url yazdığımınzda da aynı rotayı takip edecektir.
https://localhost:44563/news/list /Tanımladığımız 3. Route'ye denk geldi.
https://localhost:44563/haberlistesi/news/list /Tanımladığımız 1. Route'ye denk geldi.
{
controllerName: "News",
actionName: "List",
routeParameter: [ ]
}
Şimid "/hava-durumu" Url'si ile istekte bulunalım
https://localhost:44563/hava-durumu /Tanımladığımız 2. Route'ye denk geldi.
{
controllerName: "Weather",
actionName: "Index"
}
2. Route'de belirtildiği gibi istediğimiz "/hava-durumu" şeklinde statik bir Url ile geldiğinde WeatherController içideki Index metoduna git demiş olduk. Hangi Controller ve Action metoduna gidileceğini defaults'a karşılık gelen kısımdan belirtmiş oluyoruz.
Routelerimizi Configure metodunda alt alta yazmak, kod karmaşasına neden olacağından Route'leri ayrı bir class'a alıp bu class'ı Configure metodundan çağırırsak kod karmaşasından kurtulmuş olacağız. Diğer Middleware'lerimiz ile karışmayacak bir kod düzeni elde etmiş olacağız.
Misalen RouteConfig isimli class'ı oluşturalım ve onun altında Configure isminde bir metot oluşturalım.
using Microsoft.AspNetCore.Routing;
using Microsoft.AspNetCore.Builder;
namesapace RouetExample.Routes
{
public class RouteConfig
{
public void ConfigureRoute(IEndpointRouteBuilder routes)
{
routes.MapControllerRoute(
name: "NewList",
pattern: "haberlistesi/{Controller}/{Action}",
defaults: new { controller = "News", action = "List" });
routes.MapControllerRoute(
name: "havadurumu",
pattern: "hava-durumu",
defaults: new { controller = "Weather", action = "Index" });
routes.MapControllerRoute(
name: "default",
template: "{controller=Home}/{actian=Index}/{id?}");
}
}
}
ConfigureRoute metodumuzu oluşturduktan sonra Startup sınıfındaki Configure metodundan, bu metodu Route'lerimizi yazdığımız şerden çağıralım.
public void Configure(IApplicationBuilder app)
{
//Bir hata durumunda ekrana hatayı göstermesi için yazılmış Middleware
app.UseDeveloperExceptionPage();
#region route
app.UseEndpoints(new RouteConfig().ConfigureRoute);
#endregion
}
Yukarıdaki örnek işlemlerin aynılarını bu örnekte yaparsak aynı sonuçları alırız. Bu şekilde kodumuz daha düzenli bir hale gelmiş olacatır.
Route'ler saysinde Url yapısında işimize yarayacak verileri alıp bunları uygulamamız içinde kullanabiliriz.
Bir önceki yaptığımız örnekte hava durumu icin kullandığımız WeatherController aynen kalsın.
Önceki örnekte kullandığımız havadurumu isimli Route'yu cityId parametresi alacak şekilde değiştirelim.
routes.MapControllerRoute(
name: "havadurumu",
pattern: "hava-durumu/{cityId}",
defaults: new { controller = "Weather", action = "Index" });
Misalen WeatherController içindeki Index Action metodunu da Route'den alınan veriyi ekrana Json olarak yazmak için gerekli kodu yazalım.
public IActionResult Index()
{
return Json(new { controllerName = "Weather", actionName = "Index", routeParameter = new List<string>() { RouetData.Values["cityId"]?.ToString() } });
}
Uygulamayı çalıştıralım ve taryıcıdan https://localhost:44563/hava-durumu/47 şeklinde bir istek gönderelim.
{
controllerName: "Weather",
actionName: "Index",
routeParameter: [
"34"
]
}
Ekran çıktısından da görüldüğü üzere RouteData.Values["cityId"].ToString() komutu ileUrl'den gönderdiğimiz veriyi ekrana Json olarak yazdık.
Şimdi de cityId'yi RouteData.Values[] komutu ile değil de Action metoduna parametre gönderek alalım.
Belirlediğimiz Route yapısı olduğu gibi kalsın. Action metodunu cityId parametresi alacak şekilde değiştirelim.
public IActionResult Index()
{
return Json(new { controllerName = "Weather", actionName = "Index", routeParameter = new List<string>() { cityId.ToString() } });
}
cityId'yi parametre olarak alıp ekrana Json olarak basılması için gönderdik. Uygulamamız bir önceki örnektei gibi istekte bulunduğumuzda aynı şekilde yanıt verecektir.
Action metoduna gönderilecek parametrenin null olabilme durumunu da Route'mizde gözetebiliriz. Böylece Action metodundaki parametreye değer vermesek bile Route yapısındaki verdiğimiz Controller ve Action rotasını takip edip yolunu bulacatır. Sadece gönderilen parametre null olarak gidecektir.
Misalen; Route'mizde null olabilmesini istediğimiz parametrenin sonuna ? karakteri ekleriz.
routes.MapControllerRoute(
name: "havadurumu",
pattern: "hava-durumu/{cityId?}",
defaults: new { controller = "Weather", action = "Index" });
Aynı zamanda Index metoduna parametrenin tipini tanımladıktan sonra ? karakteri ekleriz.
public IActionResult Index()
{
return Json(new { controllerName = "Weather", actionName = "Index", routeParameter = new List<string>() { cityId?.ToString() } });
Uygulamayı çalıştıralım ve https://localhost:44563/hava-durumu şeklinde istekte bulunalım.
{
controllerName: "Weather",
actionName: "Index",
routeParameter: [
null
]
}
Görüldüğü gibi routeParameter değişkenine null eklendi.
Şimdi ise Url'den aldığımız parametreye varsayılan bir değer ataması yapalım.
Misalen, Route yapsını, cityId'ye varsayılan mbir değer ataması yapacak şekilde düzenleyelim.
routes.MapControllerRoute(
name: "havadurumu",
pattern: "hava-durumu/{cityId?}",
defaults: new { controller = "Weather", action = "Index", cityId = 5 });
cityId'ye varsayılan olarak değer ataması yapılmıştır. WeatherController'de değişiklik yapmadan uygulamamızı çalıştırdığımızda Json ekran çıktısında routeParameter listesine varsayılan olarak 5 değerini ekleyecektir. Ekran çıktısı aşağıdaki gibi olacaktır.
{
controllerName: "Weather",
actionName: "Index",
routeParameter: [
"5"
]
}
Bu yazımızın sonuna geldik. bir sonraki yazıda Route konusundan yine devam edeceğiz. Kısaca özetleyecek olursak Routing nedir, Varsayılan Route Yapısı, Özel Route Yapısı ve Route Data başlaılarını inceledik. İlgilenenlerin faydalanması ümidiyle. Projeye github'tan ulaşabilirsiniz.
Blog Listesi